Retrofit 2使用HttpLoggingInterceptor.Level.BODY在日志中打印空响应主体

And*_*nik 9 android retrofit2

我用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();
    }
Run Code Online (Sandbox Code Playgroud)

以下是我如何使用它来初始化我的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);
Run Code Online (Sandbox Code Playgroud)

直到昨天我才得到完整的登录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)
Run Code Online (Sandbox Code Playgroud)

你可以看到我得到的一切而不是反应的身体D/OkHttp: }.但在Postman中我看到一个正常的响应体,在我的应用程序中一切正常,所以问题只在于记录.

任何人都可以帮助我理解为什么会发生这种情况?

PS如果请求有正文,我会看到请求正文,问题只在于响应bodys.

Dee*_*rma 6

使用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);
Run Code Online (Sandbox Code Playgroud)