代码之家  ›  专栏  ›  技术社区  ›  kinkajou Pablo Santa Cruz

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

  •  1
  • kinkajou Pablo Santa Cruz  · 技术社区  · 8 年前

    我的api基本url是:

    https://locodealapi.herokuapp.com/api/deals

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

    x-access-token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX25hbWUiOiJkZWFsQWRtaW4iLCJ1c2VyX3Bhc3N3b3JkIjoiY2U5MDZkNDkzMWY3NmFhZWFmZTViNjM0YTg3Y2RkYzQ4YjMzNmUzYmVlZDU1N2ZhZTI0YzMxZTY3YmQyN2NhZDg4NDJmNzJlNTJlNGUyODc5ZWVkODY1MDljYzY5ODJlNDYwMjU0Mzk4ODQzMTljMTQxMGMwOTcxNGU0Y2MxMDNiMDQwYjkwOTQ1OTMyMjYwMGI1MjgwMmRkOTc2YTE4OGE5MTZiMWU4ZmU1YmY1ZWZiNTlkYjc2NDhmMjQxOTg0ODdiMWE5OGVhMjg2ZWZjZDI1M2Y5ZWUxNTQ0OTI3ODZiYjY3NzNmZTZjNGY3ODhmNzJjMzQ0NTEwMzg2NjkyNzIzMjNiMjZmYjFhMmUzYjE0ZTQ0Nzc0NzljMTExMzNkZjIwMmE3ODY2OGIxZjdiY2NlZjQ5NTM0YTJhYzk5N2Y0MTc0NzU2OTkwOTg5NjQ1YzljNWQxYTZkYmUyZTI1ZjFlNDE3YjdhYWI1N2QyZGJhNmVmOWEwNzk5N2Q5ZDcyNTgxMzUyYzc4Y2IxY2RiMDRmNDFkZjMwNzdjYzAxMGM2YmYzYWMzOTQ5OTJjN2Y3ZGVmYmE3YzllZWMxMzI5ODhlODBiM2RmYWE5NTVhMzE3NTgxNThiZjYxYjYyN2U4Y2UzOTg2NmRkODk2YzBlZDkzNDJlMzhiMzhkM2Q0ZTY0YWIzZWIwNGU4YmU5MGQwNmM2NTg2OWYyNzZkMzgyOTU3MTFkODgyNjI4NGIxMjkzYzQ0ZGNjMWM3ZjU2YmE4OGM5MTkyNDMzZWY0YTcwZGE2NTkzMzAwZmUzMGMxYjkwOWY5YmJjMDhmY2M5Zjk3NjUwYmJkOTVhNzExNWVlOGY3MjI5N2Q4ZGY4MjZiMTk0MTBlZjQ0OWZkMTQ1NTg3Nzc2NjUxZDI5OGMyYzMwMTZiMDMxMGEwZjRlMWQ4NzgwZTExYmVkOTZhYzg3MDU2YzIwYWU4ODZiYjI3NGZkNGVhZGMzMjQ0ZjlmMmZkMGIyMGMzZTAyZjI1NGQ3OWYzYzhiM2FmZGJiM2UzYTM1YTA2MjNjMTQwY2JmNzMxZWMxYjE2Y2VmNmIwY2RhMjQ1YjkzZmY4NzQ1MGRjNWFhZDE2MzdkNTQ5ZjM5ZDkwZjk5MWFiNWMxNTcwNWExYWJjYWQxYzQyYjNmMTViN2Y5N2I0YTc1ZDA2YTgwYjkwOWI0ZDJlZjRiNWE0NzdhMTMzYWI0ODkwMmIyNWFiM2VmYTMzNDdjMDcxODQ4NmMwYmU2NGQxYzUxMjA1ZTMwYjU5NjY3Yjk5ZTVlYTdkZWNiMWE4MWRkNjcyYzEwMzU5YmM2NGNlZWI3ZTEyOWJlYjZjYWUzYTM0ZjM0M2NiYjk4NyIsImNyZWF0ZXRpbWUiOm51bGwsImZpcnN0X25hbWUiOm51bGwsImxhc3RfbmFtZSI6bnVsbCwiYWdlIjpudWxsLCJzZXgiOm51bGwsImRvYiI6bnVsbCwic3RhdHVzIjpudWxsLCJpdGVyYXRpb24iOjEwMDAwLCJ1c2VyX3R5cGUiOiIwIiwidXNlcl9pbWFnZSI6bnVsbCwic2FsdCI6Ikh1dm9VQ3FRak81Mi9BbkJIdmp2MldEMERod2JmM0R4ZXV6ZWJMSlFYK3hZTUptMmRJSUw3VFYvcnFVVXFVNUpmRlY0dHhkMHNCcXhLbnVNakU2YlNzVnpaQ0dWVXg3YmY4MGNubTR5WnB5OElEUWowY1crTXhCUXdvMFNja2UzT0FnVk4zd2pnNmlxSVk3VnJwRmw1WTNLRzFwY1NMelZjREJiME9XdXdjcz0iLCJpYXQiOjE1MTAxMjY1OTUsImV4cCI6MTUxODc2NjU5NX0.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)中运行良好

    5 回复  |  直到 8 年前
        1
  •  3
  •   pankaj yadav    8 年前

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

    第二,在改造中尝试更改url基url .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”)字符串x\u access\u token);

        2
  •  1
  •   Sumeet Rukeja    8 年前

    今天的问候!

    试试这个:

    @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有一个参数,可以作为方法deals()中的第二个参数传递。可以传递多个参数作为方法的参数。

    有关更多详细信息,请参阅以下链接: https://futurestud.io/tutorials/retrofit-send-data-form-urlencoded

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

        3
  •  0
  •   Nilesh Deokar    8 年前

    A. 400 response 这意味着您的请求和服务器之间存在分歧,但请求是创建、发送和解析的。这意味着 Retrofit 工作正常。您可以使用OkHttp的日志拦截器来记录原始请求,并将其与服务器期望的进行比较。

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

        4
  •  0
  •   Deepank Dwivedi    8 年前
    //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();
                                    }
                                });
    
        5
  •  0
  •   Mohammed Fathi    5 年前

    对我来说,问题是因为我在Gson builder中有一行:

     .excludeFieldsWithoutExposeAnnotation()
    

    使用上述行,如果模型类中未使用 @Exposed 注释。 正在删除 .excludeFieldsWithoutExposeAnnotation() 帮我解决了这个问题。