2016-02-03 22 views
11

Mam wymóg uzyskania treści żądania i wykonania niektórych operacji logicznych z Retrofit 2.0 przed wykonaniem operacji enque. Ale niestety nie mogę pobrać treści treści posta z mojego zgłoszenia serwisowego. Obecnie po wielu poszukiwaniach znalazłem tylko jedno rozwiązanie, takie jak logging, request, które publikuję za pomocą Retrofit 2.0 z this method przy użyciu HttpLoggingInterceptor z OkHttpClient. Używam następujący kod do logowania ciało życzenie w Android logcat:Uzyskiwanie treści treści żądania za pomocą metody POST Retrofit 2.0

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(Level.BODY); 
    OkHttpClient httpClient = new OkHttpClient(); 
    httpClient.interceptors().add(logging); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(baseURL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    return retrofit.create(apiClass); 

Problem jestem stoi z powyższej metody:

  1. żądanie ciała są widoczne tylko na domyślnie Android logcat jak

02-04 01:35:59.235 5007-5035/com.example.retrofitdemo D/OkHttp:{"nameValuePairs":{"id":"1","name":"chandru","type":"user"}}

jednak powyższa metoda zwraca onl y ciało odpowiedzi w logcat, nie jestem w stanie uzyskać go jako String lub JSONObject. Mimo że gdybym był w stanie uzyskać ciało odpowiedzi za pomocą HttpLoggingInterceptor, moja treść zapytania będzie wyświetlana w Logcat z tagiem "OkHttp" przez cały czas, nawet po tym, jak aplikacja wejdzie do produkcji (więc przede wszystkim prowadzi to do pewnego rodzaju odciążenia opublikować dane w logcat).

Moja Wymagania:

Muszę dostać ciało żądania jako String lub JSONObject lub dowolnej metody bez drwiąc dane stanowisko w logcat.

Co próbowałem:

próbowałem sprowadzić ciało żądań nawet po onResponse od Response<T> response, ale chociaż nie mogłem w stanie zrobić to możliwe. Proszę znaleźć kod, który używam do tego celu, co następuje:

Gson gson = new Gson(); 
String responseString = gson.toJson(response.raw().request().body()); 

Uwaga: Powyższy przerobiona ciało żądanie przy użyciu gson.toJson metoda zwraca tylko dane meta nie dane żądania POST.

Uprzejmie pomóżcie mi z tym, dostarczając cennych wskazówek i rozwiązań. Nie mam pojęcia, jak to zrobić. Całkowicie się z tym uporałem przez ostatnie dwa dni. Proszę wybaczyć, jeśli moje pytanie jest zbyt długie. Twoje komentarze są zawsze mile widziane. Daj mi znać, jeśli moje wymagania nie są jasne. Z góry dziękuję.

+0

wziąłeś rozwiązanie tego problemu, m stoi również problemu z tym – sector11

+0

Nie jeszcze nie. Daj mi znać, jeśli dostaniesz. – Chandru

Odpowiedz

31

Mam to działa z tego linku Retrofit2: Modifying request body in OkHttp Interceptor

private String bodyToString(final RequestBody request) { 
      try { 
       final RequestBody copy = request; 
       final Buffer buffer = new Buffer(); 
       if (copy != null) 
        copy.writeTo(buffer); 
       else 
        return ""; 
       return buffer.readUtf8(); 
      } catch (final IOException e) { 
       return "did not work"; 
      } 
     } 

modernizacyjnej zależności używam są

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3' 
    compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1' 
    compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1' 
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3' 
+0

dziękuję bardzo. Niech sprawdzę. – Chandru

+0

Dodaję następujące wersje w build.gradle – Chandru

+0

compile 'com.squareup.retrofit: retrofit: 2.0.0-beta2' kompilacja 'com.squareup.retrofit: converter-gson: 2.0.0-beta2' compile 'com .squareup.okhttp: logging-interceptor: 2.6.0 ' – Chandru

0

Ja też miałem podobny problem, miałem ustawione JSON jako @Body typu w doposażenie, więc nazwa awaria pojawia się przed surowym ciałem i można ją zobaczyć wewnątrz przechwytywacza. Mimo że logujemy/debugujemy plik jsonObject.toString, widzimy, że żądanie jest poprawne bez przedstawienia nazwy.

co zrobiłem było ustawiając

Call<ResponseBody> getResults(@Body JsonObject variable); 

oraz w wywołaniu metody i przeobraził JSONObject do JSONObject przez

new JsonParser().parse(model).getAsJsonObject();