Android 改装收到400个错误请求,但与邮递员一起工作

Android 改装收到400个错误请求,但与邮递员一起工作,android,node.js,heroku,passport.js,retrofit2,Android,Node.js,Heroku,Passport.js,Retrofit2,我的api基本url是: 在邮递员通行证下面的标题和它的作品很好 x-access-token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX25hbWUiOiJkZWFsQWRtaW4iLCJ1c2VyX3Bhc3N3b3JkIjoiY2U5MDZkNDkzMWY3NmFhZWFmZTViNjM0YTg3Y2RkYzQ4YjMzNmUzYmVlZDU1N2ZhZTI0YzMxZTY3YmQyN2NhZDg4NDJm

我的api基本url是:

在邮递员通行证下面的标题和它的作品很好

x-access-token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX25hbWUiOiJkZWFsQWRtaW4iLCJ1c2VyX3Bhc3N3b3JkIjoiY2U5MDZkNDkzMWY3NmFhZWFmZTViNjM0YTg3Y2RkYzQ4YjMzNmUzYmVlZDU1N2ZhZTI0YzMxZTY3YmQyN2NhZDg4NDJmNzJlNTJlNGUyODc5ZWVkODY1MDljYzY5ODJlNDYwMjU0Mzk4ODQzMTljMTQxMGMwOTcxNGU0Y2MxMDNiMDQwYjkwOTQ1OTMyMjYwMGI1MjgwMmRkOTc2YTE4OGE5MTZiMWU4ZmU1YmY1ZWZiNTlkYjc2NDhmMjQxOTg0ODdiMWE5OGVhMjg2ZWZjZDI1M2Y5ZWUxNTQ0OTI3ODZiYjY3NzNmZTZjNGY3ODhmNzJjMzQ0NTEwMzg2NjkyNzIzMjNiMjZmYjFhMmUzYjE0ZTQ0Nzc0NzljMTExMzNkZjIwMmE3ODY2OGIxZjdiY2NlZjQ5NTM0YTJhYzk5N2Y0MTc0NzU2OTkwOTg5NjQ1YzljNWQxYTZkYmUyZTI1ZjFlNDE3YjdhYWI1N2QyZGJhNmVmOWEwNzk5N2Q5ZDcyNTgxMzUyYzc4Y2IxY2RiMDRmNDFkZjMwNzdjYzAxMGM2YmYzYWMzOTQ5OTJjN2Y3ZGVmYmE3YzllZWMxMzI5ODhlODBiM2RmYWE5NTVhMzE3NTgxNThiZjYxYjYyN2U4Y2UzOTg2NmRkODk2YzBlZDkzNDJlMzhiMzhkM2Q0ZTY0YWIzZWIwNGU4YmU5MGQwNmM2NTg2OWYyNzZkMzgyOTU3MTFkODgyNjI4NGIxMjkzYzQ0ZGNjMWM3ZjU2YmE4OGM5MTkyNDMzZWY0YTcwZGE2NTkzMzAwZmUzMGMxYjkwOWY5YmJjMDhmY2M5Zjk3NjUwYmJkOTVhNzExNWVlOGY3MjI5N2Q4ZGY4MjZiMTk0MTBlZjQ0OWZkMTQ1NTg3Nzc2NjUxZDI5OGMyYzMwMTZiMDMxMGEwZjRlMWQ4NzgwZTExYmVkOTZhYzg3MDU2YzIwYWU4ODZiYjI3NGZkNGVhZGMzMjQ0ZjlmMmZkMGIyMGMzZTAyZjI1NGQ3OWYzYzhiM2FmZGJiM2UzYTM1YTA2MjNjMTQwY2JmNzMxZWMxYjE2Y2VmNmIwY2RhMjQ1YjkzZmY4NzQ1MGRjNWFhZDE2MzdkNTQ5ZjM5ZDkwZjk5MWFiNWMxNTcwNWExYWJjYWQxYzQyYjNmMTViN2Y5N2I0YTc1ZDA2YTgwYjkwOWI0ZDJlZjRiNWE0NzdhMTMzYWI0ODkwMmIyNWFiM2VmYTMzNDdjMDcxODQ4NmMwYmU2NGQxYzUxMjA1ZTMwYjU5NjY3Yjk5ZTVlYTdkZWNiMWE4MWRkNjcyYzEwMzU5YmM2NGNlZWI3ZTEyOWJlYjZjYWUzYTM0ZjM0M2NiYjk4NyIsImNyZWF0ZXRpbWUiOm51bGwsImZpcnN0X25hbWUiOm51bGwsImxhc3RfbmFtZSI6bnVsbCwiYWdlIjpudWxsLCJzZXgiOm51bGwsImRvYiI6bnVsbCwic3RhdHVzIjpudWxsLCJpdGVyYXRpb24iOjEwMDAwLCJ1c2VyX3R5cGUiOiIwIiwidXNlcl9pbWFnZSI6bnVsbCwic2FsdCI6Ikh1dm9VQ3FRak81Mi9BbkJIdmp2MldEMERod2JmM0R4ZXV6ZWJMSlFYK3hZTUptMmRJSUw3VFYvcnFVVXFVNUpmRlY0dHhkMHNCcXhLbnVNakU2YlNzVnpaQ0dWVXg3YmY4MGNubTR5WnB5OElEUWowY1crTXhCUXdvMFNja2UzT0FnVk4zd2pnNmlxSVk3VnJwRmw1WTNLRzFwY1NMelZjREJiME9XdXdjcz0iLCJpYXQiOjE1MTAxMjY1OTUsImV4cCI6MTUxODc2NjU5NX0.5XFJnJqTsfID9uqOwkNf46oraj9jDxic7qNSqBdunD0
在改装界面,我有以下,但得到400坏的要求

@POST("api/deals")
    Call<ResponseBody> deals(@Header("x-access-token") String x_access_token)
@POST(“api/deals”)
呼叫交易(@Header(“x-access-token”)字符串x\u-access\u-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);

            }
        });
reformation-reformation=new-reformation.Builder()
.baseUrl(“https://locodealapi.herokuapp.com")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
AppRestAPI client=reformation.create(AppRestAPI.class);
调用call1=client.deals(
代币
);          
call1.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.i(标记“响应为”+response.message());
Log.i(标记“响应为”+response.body());
试一试{
Log.i(标记“响应为”+response.errorBody().string());
if(response.code()==400){
Log.v(“错误代码400”,response.errorBody().string());
}
}捕获(IOE异常){
e、 printStackTrace();
}    
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(标签“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 
11-21:14:30.939 3253-3342/?D/OkHttp:-->POSThttps://locodealapi.herokuapp.com/api/deals
11-21 21:14:30.939 3253-3342/? D/OkHttp:内容长度: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:-->结束POST(0字节正文)
11-21 21:14:34.188 3253-3342/? D/OkHttp:祝您节日快乐

试试这个:

@FormUrlEncoded
@POST("/api/deals")
    Call<ResponseBody> deals(@Header("x-access-token") String x_access_token, @Field("<parameter_name>") String parameter);
@FormUrlEncoded
@POST(“/api/deals”)
呼叫交易(@Header(“x-access-token”)字符串x\u access\u token,@Field(“”)字符串参数);
调用api,如下所示:

 Call<ResponseBody> call = client.deals(token,"<parameter>");
Call Call=client.deals(令牌“”);
这里,我假设API有一个参数,可以作为方法deals()中的第二个参数传递。您可以传递多个参数作为方法的参数

有关更多详细信息,请参阅以下链接:


我希望,这能解决你的问题。如果没有,请提供您要调用的API的完整详细信息。

一个
400响应
表示您的请求和服务器之间存在分歧,但请求已创建、发送并解析了响应。这意味着
改装
工作正常。您可以使用OkHttp的日志拦截器来记录原始请求,并将其与服务器期望的结果进行比较


另外,您的
响应大小约为
5.96MB
。这是太大的反应。您可以实现分页或类似的方法来分解数据,而不是在单个响应中接收这么多数据。这可能是原因之一

1.首先,你的api是一个GET方法,所以使用@GET代替@POST

第二,尝试在改造中更改url基url .baseUrl(“”) 至.baseUrl(“”) 这会奏效的。或者把你的问题留在评论中 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) {}
    });
}
HttpLoggingInterceptor拦截器=新的HttpLoggingInterceptor();
拦截器.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient OkHttpClient=新建OkHttpClient.Builder().addInterceptor(
新拦截器(){
@凌驾
公共响应拦截(链)引发IOException{
Request original=chain.Request();
//请求自定义:添加请求头
Request.Builder requestBuilder=original.newBuilder()。
方法(original.method(),original.body());
Request=requestBuilder.build();
返回链。继续(请求);
}
})
.addInterceptor(拦截器).connectTimeout(60,TimeUnit.SECONDS).readTimeout(60,TimeUnit.SECONDS).build();
改装改装=新改装.Builder().baseUrl(“https://locodealapi.herokuapp.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient.build();
UserApi UserApi=reformation.create(UserApi.class);
Call Call=userApi.deals(“您的令牌”);
call.enqueue(新回调(){
@凌驾
public void onResponse(呼叫,改装2.Response){
}
@凌驾
public void onFailure(Call,Throwable t){}
});
}
@获取(“api/交易”) 呼叫交易(@Header(“x-access-token”)字符串x_-access_-token)

在类中使用,它将像这样启动连接

ApiInterface apiService =
                ApiClient.getClient().create(ApiInterface.class);
这将是您的API接口

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);

 }
公共接口{
@发布(“您的url在此”)
调用sampleMethod();
/*对于非空主体,请使用此*/
//调用getSignUpResponse(@Body JsonObject register);
//对于表单数据,请使用
@FormUrlEncoded
@发布(“您的url在此”)
调用sampleMethod1(@Field(value=“param1_key”,encoded=true)字符串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();
                                }
                            });
JsonObject obj=新的JsonObject();
对象addProperty(“key1”、“keyvalue”);
Call Call=apiService.sample1(obj);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.body().get(“status”).getAsString().equals(“1”)){
Toast.makeText(context,response.body().get(“msg”).getAsString(),Toast.LENGTH\u LONG.show();
}否则{
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();
                                }
                            });
 .excludeFieldsWithoutExposeAnnotation()