【问题标题】:Retrofit 2 prints empty response body in log with HttpLoggingInterceptor.Level.BODYRetrofit 2 使用 HttpLoggingInterceptor.Level.BODY 在日志中打印空响应正文
【发布时间】:2016-07-02 08:21:57
【问题描述】:

我使用Retrofit 2.0.0。这是构建我的 HTTP 客户端的代码

protected OkHttpClient getHttpClient(){
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(
                chain -> {
                    Request original = chain.request();

                    Request.Builder requestBuilder = original.newBuilder();

                    requestBuilder.header("Accept-Language", App.getInstance().getPrefs().getSelectedLanguage().toLowerCase());
                    requestBuilder.header("Accept-Encoding", "gzip");

                    if(API.this instanceof PrivateAPI){
                        LoginResponse loginResponse = AuthManager.getInstanse().getLoginResponse();
                        requestBuilder.header("Authorization", String.format("%s %s",
                                loginResponse.getTokenType(),
                                loginResponse.getAccessToken()));
                    }

                    requestBuilder.method(original.method(), original.body());

                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                });

        if(BuildConfig.DEBUG){
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(loggingInterceptor);
        }

        return builder.build();
    }

下面是我如何使用它来初始化我的 Retrofit API 接口:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(getGson()))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(getHttpClient())
            .build();

    apiService = retrofit.create(PrivateAPIInterface.class);

直到昨天,我才按原样完全登录 logcat。但突然间,我的日志中开始出现空响应体。所以这是我现在得到的日志示例:

  D/OkHttp: --> GET http://MY_DOMAIN/utility/gaz?branchid=&phone=21919&customerid= HTTP/1.1
  D/OkHttp: Accept-Language: hy
  D/OkHttp: Accept-Encoding: gzip
  D/OkHttp: Authorization: 0yXK65Go_hRPT32WIP4DAKjmzIaM0riSLlybHhusvwmYJSxTdTVBrkL5CaqopXgrOuNFL5xvR5uVwCbprWrxvfYTMJ1I_AUmd5TKdNL4ptkUrJuOy1kGiule_yveCFv0GbTiAXhYjdfynJICJEVWc54ibnIv_Q14dLpPuVle5IaRuHmza2Pavkrhzi42sfMsK0Qpxaueu8eRPysk6MP9WkTnSKYIAThuq3sHq8RGAnkaLBx
  D/OkHttp: --> END GET
  D/OkHttp: <-- 200 OK http://MY_DOMAIN/utility/gaz?branchid=&phone=21919&customerid= (394ms)
  D/OkHttp: Content-Length: 8527
  D/OkHttp: Content-Type: application/json; charset=utf-8
  D/OkHttp: Server: Microsoft-IIS/7.5
  D/OkHttp: X-Powered-By: ASP.NET
  D/OkHttp: Date: Wed, 16 Mar 2016 12:30:37 GMT
  D/OkHttp: OkHttp-Sent-Millis: 1458131438086
  D/OkHttp: OkHttp-Received-Millis: 1458131438438
  D/OkHttp: }
  D/OkHttp: <-- END HTTP (8527-byte body)

如您所见,我得到的所有内容都不是响应正文,而是D/OkHttp: }。 但是在 Postman 中,我看到一个正常的响应正文,在我的应用程序中一切正常,所以问题只出在日志记录上。

谁能帮我理解为什么会发生这种情况?

附:如果请求有正文,我会看到请求正文,问题仅在于响应正文。

【问题讨论】:

    标签: android retrofit2


    【解决方案1】:

    使用 retrofit-2 你应该使用 OkHttp3 来获取完整的日志。将此添加到您的依赖项中:compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://example.com")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    
    return retrofit.create(ApiClient.class);
    

    【讨论】:

    • 我有它 - 在我尝试编译 'com.squareup.okhttp3:logging-interceptor:3.0.1' 之前编译 'com.squareup.okhttp3:logging-interceptor:3.2.0'。 ..它不起作用
    • 您在改造构建器中传递了getHttpClient()。而不是你应该通过 OkHttpClient(请参阅我的答案的第 3 行)。我已经尝试过了,它提供了完整的日志并且工作正常。按照我发布的方式使用它,您无需为 getHttpClient() 创建函数。
    • getHttpClient() 与您所做的完全相同,但其中还有额外的逻辑。无论如何,我尝试了您建议的方式,但没有成功。
    【解决方案2】:

    ResClient.class

     public class RestClient {
    
            private static ApiInterface apiInterface;
    
            static {
                setupRestClient();
            }
    
            private static void setupRestClient() {
                OkHttpClient httpClient = new OkHttpClient();
    
                RestAdapter restAdapter = new RestAdapter.Builder()
                                          .setEndpoint(NetworkConstants.URL_BASE_LIVE)
                                          .setLogLevel(RestAdapter.LogLevel.FULL)
                                          .setLog(new AndroidLog("Retrofit"))
                                          .setClient(new OkClient(httpClient))
                                          .build();
    
                apiInterface = restAdapter.create(ApiInterface.class);
            }
    
    
            public static ApiInterface getAdapter(){
                    return apiInterface;
            }
        }
    

    ApiInterface.class

    public interface ApiInterface {
    
    
        // result api
        //All result api async
        @Headers({"Authorization: ######################"}) //for the header authorization if needed.
        @GET(NetworkConstants.URL_GET_RESULTS)
        void getResult(@QueryMap Map <String, String> params, Callback<ArrayList<Results>> callback);
    }
    

    现在这样称呼它

    // Fetching result through Api Hit   
            RestClient.getAdapter().getResult(getJobsParams(), new Callback<ArrayList<Result>>() {
    
                @Override
                public void success(ArrayList<Result> result, retrofit.client.Response response) {
                       // Do your Work
                }
    
                @Override
                public void failure(RetrofitError error) {
                       // show server or other error to user
                }
            });
    

    【讨论】:

    • 你给的答案是Retrofit 1,我的是Retrofit 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多