2016-02-03 4 views
11

J'ai besoin d'un corps de requête et d'effectuer certaines opérations logiques avec Retrofit 2.0 avant de procéder à l'opération enque. Mais malheureusement, je ne suis pas en mesure d'obtenir le contenu du corps de message de mon appel de service. À l'heure actuelle après avoir beaucoup cherché, j'ai trouvé une seule solution comme logging le request que je poste en utilisant Retrofit 2.0 de this method en utilisant HttpLoggingInterceptor avec OkHttpClient. J'utilise le code suivant pour vous connecter le corps de demande dans l'Android Logcat:Obtention du contenu du corps de la demande à l'aide de la méthode POST de 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); 

Problème Je suis face à la méthode ci-dessus:

  1. corps de la demande ne sont vus que sur la valeur par défaut Android Logcat comme

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

Mais la méthode ci-dessus renvoie ONL y corps de réponse dans le logcat, je ne suis pas en mesure de l'obtenir soit String ou JSONObject. Bien que si je pouvais obtenir le corps de la réponse en utilisant HttpLoggingInterceptor, mon corps de la requête sera affiché dans le Logcat avec la balise "OkHttp" tout le temps même après que l'application entre dans la production (Donc, cela conduit en quelque sorte à publier des données dans le logcat).

Mon exigence:

J'ai besoin pour obtenir le corps de la demande comme String ou JSONObject ou toute autre méthode sans injuriant les données de poste dans le Logcat.

Ce que j'ai essayé:

J'ai essayé d'aller chercher le corps de la demande même après onResponse de Response<T> response, mais si je ne pouvais pas en mesure de l'obtenir fait possible. S'il vous plaît trouver le code que j'utilise à cet effet comme suit:

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

Note: Le corps de la requête convertie ci-dessus à l'aide gson.toJson méthode renvoie uniquement les données méta pas les données post demande.

Veuillez m'aider avec ceci en fournissant vos conseils et solutions valables. Je n'ai aucune idée comment faire ça. Je suis complètement coincé avec cela pour les deux derniers jours. S'il vous plaît pardonnez si ma question est trop longue. Vos commentaires sont toujours les bienvenus. Faites-moi savoir si mes exigences ne sont pas claires. Merci d'avance.

+0

avez-vous la solution pour cela, m face aussi problème avec ce – sector11

+0

Non pas encore. Faites-moi savoir si vous en avez. – Chandru

Répondre

31

Je l'ai eu à travailler à partir de ce lien 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"; 
      } 
     } 

dépendances Rénovation J'UTILISE sont

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

vous remercie beaucoup. Laisse moi vérifier. – Chandru

+0

J'ajoute les versions suivantes dans build.gradle – Chandru

+0

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

0

moi aussi eu le problème similaire, je l'avais mis en JSON comme @Body type dans retrofit, donc le nomvaluepair apparaît devant le corps brut, et il peut être vu à l'intérieur de l'intercepteur. Même si nous enregistrons/déboguons le jsonObject.toString, nous considérons que la requête est correcte sans que le namevaluepair ne soit présenté.

Ce que je l'avais fait était par la mise

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

et l'appel de la méthode i converti le JSONObject à JsonObject par

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