改造得到400不好的请求,但与邮递员合作
我的api基地的url是:
https://locodealapi.herokuapp.com/api/deals
在邮递员通过后面的标题,它工作正常。
x-access-token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ.5XFJnJqTsfID9uqOwkNf46oraj9jDxic7qNSqBdunD0
在改造接口我有以下但得到400坏请求
@POST("api/deals") Call<ResponseBody> deals(@Header("x-access-token") String x_access_token)
调用代码:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://locodealapi.herokuapp.com") .addConverterFactory(GsonConverterFactory.create()) .client(httpClient.build()) .build(); AppRestAPI client = retrofit.create(AppRestAPI.class); Call<ResponseBody> call1 = client.deals( token ); call1.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.i(TAG, "The response is " + response.message()); Log.i(TAG, "The response is " + response.body()); try { Log.i(TAG, "The response is " + response.errorBody().string()); if (response.code() == 400) { Log.v("Error code 400",response.errorBody().string()); } } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.e(TAG, "onFailure: Failed", t); } });
OKHTTP日志拦截器
11-21 21:14:30.939 3253-3342/? D/OkHttp: --> POST https://locodealapi.herokuapp.com/api/deals 11-21 21:14:30.939 3253-3342/? D/OkHttp: Content-Length: 0 11-21 21:14:30.940 3253-3342/? D/OkHttp: x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyNSwidXNlcl9uYW1lIj.... 11-21 21:14:30.942 3253-3342/? D/OkHttp: --> END POST (0-byte body) 11-21 21:14:34.188 3253-3342/? D/OkHttp: <-- 400 Bad Request https://locodealapi.herokuapp.com/api/deals (3246ms) 11-21 21:14:34.189 3253-3342/? D/OkHttp: Connection: close 11-21 21:14:34.189 3253-3342/? D/OkHttp: Server: Cowboy 11-21 21:14:34.189 3253-3342/? D/OkHttp: Date: Tue, 21 Nov 2017 15:29:33 GMT 11-21 21:14:34.190 3253-3342/? D/OkHttp: Content-Length: 0 11-21 21:14:34.191 3253-3342/? D/OkHttp: <-- END HTTP (0-byte body) 11-21 21:14:34.196 3253-3253/? I/BaseDrawerActivity: The response is Bad Request 11-21 21:14:34.196 3253-3253/? I/BaseDrawerActivity: The response is null 11-21 21:14:34.196 3253-3253/? I/BaseDrawerActivity: The response is
注意 :相同的代码在本地nodejs服务器中工作正常(仅限http)
1.首先你的api是一个GET方法,所以用@GET代替@POST
第二次尝试更改.baseUrl(“ https://locodealapi.herokuapp.com ”)到.baseUrl(“ https://locodealapi.herokuapp.com/ ”),这将工作。 或者在评论2中留下你的问题。这是示例代码
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor( new Interceptor() { @Override public Response intercept(Chain chain) throws IOException{ Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder =original.newBuilder(). method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }) .addInterceptor(interceptor).connectTimeout(60,TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); Retrofit retrofit = new Retrofit.Builder().baseUrl("https://locodealapi.herokuapp.com/") .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient).build(); UserApi userApi = retrofit.create(UserApi.class); Call<ResponseBody> call = userApi.deals("your token"); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call,retrofit2.Response<ResponseBody> response) { } @Override public void onFailure(Call<ResponseBody> call, Throwable t) {} }); }
@GET(“api / deals”)调用交易(@Header(“x-access-token”)String x_access_token);
今天的问候!
尝试这个:
@FormUrlEncoded @POST("/api/deals") Call<ResponseBody> deals(@Header("x-access-token") String x_access_token, @Field("<parameter_name>") String parameter);
调用API如下:
Call<ResponseBody> call = client.deals(token,"<parameter>");
在这里,我假设API有一个参数,可以在方法deal()中作为第二个parameter passing。 您可以传递多个参数作为方法的参数。
请参阅以下链接了解更多详情: https : //futurestud.io/tutorials/retrofit-send-data-form-urlencoded
我希望,这解决了你的问题。 如果没有,请提供您想要调用的API的完整详细信息。
一个400 response
意味着这是你的请求和服务器之间的分歧,但是请求被创build,发送,并且响应被parsing。 这意味着Retrofit
工作正常。 您可以使用OkHttp的日志logging拦截器来logging原始请求,并将其与服务器预期的内容进行比较。
您的Response
大小约为5.96 MB
。 这个回应太大了。 而不是在一个单一的响应接收这么多的数据,你可以实现分页或类似的东西来分解数据。 这可能是其中一个原因。
//Your Main connection Class public class ApiClient { public static final int DEFAULT_TIMEOUT_SEC = 90; public static OkHttpClient client; private static Retrofit retrofit = null; public static Retrofit getClient() { OkHttpClient.Builder httpClient = new OkHttpClient.Builder() .connectTimeout(DEFAULT_TIMEOUT_SEC, TimeUnit.SECONDS) .readTimeout(DEFAULT_TIMEOUT_SEC, TimeUnit.SECONDS) .writeTimeout(DEFAULT_TIMEOUT_SEC, TimeUnit.SECONDS); httpClient.addInterceptor(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); System.out.println("API_KEY"+PrefManager.getActiveInstance(RecrouteCandidateApplication.getsCurrentContext()).getDeviceToken()); Request request = original.newBuilder() .header("x-access-token",YOUR_ACCESS_TOKEN"") .method(original.method(), original.body()) .build(); return chain.proceed(request); } }); //For logging the call on Logcat HttpLoggingInterceptor interceptor1 = new HttpLoggingInterceptor(); interceptor1.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient.addInterceptor(interceptor1); client = httpClient.build(); if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(AppConstants.BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; }
在您的类中使用,将启动这样的连接
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
这将是你的ApiInterface
public interface ApiInterface { @POST("Your url here") Call<JsonObject> sampleMethod(); /*For non-empty body use this*/ //Call<JsonObject> getSignUpResponse(@Body JsonObject register); //For form data use this @FormUrlEncoded @POST("Your url here") Call<String> sampleMethod1(@Field(value= "param1_key", encoded = true) String param1_value); }
为这个json打个电话
JsonObject obj= new JsonObject(); obj.addProperty("key1","keyvalue"); Call<JsonObject> call = apiService.sample1(obj); call.enqueue(new Callback<JsonObject>() { @Override public void onResponse(Call<JsonObject> call, Response<JsonObject> response) { if (response.body().get("status").getAsString().equals("1")) { Toast.makeText(context, response.body().get("msg").getAsString(), Toast.LENGTH_LONG).show(); } else { Toast.makeText(context, response.body().get("msg").getAsString(), Toast.LENGTH_LONG).show(); } } @Override public void onFailure(Call<JsonObject> call, Throwable t) { Toast.makeText(context, AppConstants.NO_DATA_AVAILABLE, Toast.LENGTH_LONG).show(); } });
- 错误:Logcat捕获失败:产生ENOENT
- MongoDB / Strongloop / Loopback – 带无线networking的设备之间的脱机同步无线连接
- 如何计算node.js中的数据包?
- cordova不是一个有效的任务
- 离子不在Windows 7上安装 – 获取许多错误
- 无法将npm包安装到nativescript项目(..安装nativescript-nodeify之后)
- Android应用程序使用Socket.io连接到Node.js服务器
- PhoneGap应用程序中使用Node.js / Socket.IO服务器和客户端的Android版WebSockets
- react-native run-android无法识别