2016-03-16 12 views
8

Io uso Retrofit 2.0.0. Questo è il codice che costruisce il mio cliente HTTPRetrofit 2 stampa il corpo di risposta vuoto nel registro con HttpLoggingInterceptor.Level.BODY

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

Ed ecco come lo uso per init mia Retrofit interfaccia API:

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

    apiService = retrofit.create(PrivateAPIInterface.class); 

Fino a ieri mi stavo log completo nel logcat come si suppone essere. Ma all'improvviso comincio a ottenere corpi di risposta vuoti nel mio registro. Quindi, ecco un esempio di registro ottengo ora:

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) 

Come si può vedere tutto ricevo invece di corpo di risposta è D/OkHttp: }. Ma in Postman vedo un normale corpo di risposta e nella mia app funziona tutto bene, quindi il problema riguarda solo la registrazione.

Qualcuno può aiutarmi a capire perché questo può iniziare a succedere?

P.S. In caso di richieste che hanno il corpo vedo il corpo della richiesta il problema è solo con gli organi di risposta.

risposta

6

Con retrofit-2 è necessario utilizzare OkHttp3 per ottenere registri completi. Aggiungere questo ai vostri dependecies: 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); 
+0

ce l'ho - la compilazione 'com.squareup.okht tp3: logging-intercceptor: 3.2.0 ', prima ho provato a compilare' com.squareup.okhttp3: logging-intercettatore: 3.0.1 'anche ... non funziona – Andranik

+0

Stai passando 'getHttpClient()' nel retrofit costruttore. Invece di ciò dovresti passare OkHttpClient (vedi la riga 3 della mia risposta). Ho provato questo dà registri completi e funziona bene. Usalo come ho postato non è necessario creare la funzione per getHttpClient(). –

+0

getHttpClient() fa esattamente la stessa cosa che fai, ma ha anche una logica extra. Ad ogni modo, cerco il modo in cui mi hai suggerito e non ha funzionato. – Andranik

1

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

Ora chiamarlo come

// 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 
      } 
     }); 
+1

La risposta che hai dato è per Retrofit 1, il mio è Retrofit 2 – Andranik

Problemi correlati