J'ai l'obligation d'obtenir un corps de requête et d'effectuer certaines opérations logiques avec Retrofit 2.0 avant d'effectuer l'opération enque
. Mais malheureusement, je ne parviens pas à obtenir le contenu du post-body de mon appel de service. À l’heure actuelle, après avoir beaucoup cherché, j’ai trouvé une solution, telle que logging
la request
que je publie à l’aide de Retrofit 2.0 depuis cette méthode en utilisant HttpLoggingInterceptor
avec OkHttpClient
. J'utilise le code suivant pour consigner le corps de la demande dans Android Logcat:
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 auquel je suis confronté avec la méthode ci-dessus:
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 ne renvoie que le corps de la réponse dans le logcat. Je ne parviens pas à l'obtenir sous la forme String
ou JSONObject
. Même si je peux obtenir le corps de la réponse avec HttpLoggingInterceptor
, le corps de ma demande sera affiché dans le Logcat avec la balise "OkHttp" tout le temps, même après le lancement de l'application dans la production (ce qui entraîne principalement une sorte de publier des données dans le logcat).
Mon besoin:
Je dois obtenir le corps de la demande sous la forme String
ou JSONObject
ou quelle que soit la méthode utilisée, sans altérer les données de publication dans Logcat.
Ce que j'ai essayé:
J'ai essayé d'extraire le corps de la requête même après onResponse
de Response<T> response
, mais je n'ai pas pu le faire. Veuillez trouver le code que j'utilise à cette fin comme suit:
Gson gson = new Gson();
String responseString = gson.toJson(response.raw().request().body());
Remarque: Le corps de la demande converti ci-dessus à l'aide de la méthode gson.toJson
renvoie uniquement les métadonnées, pas les données de publication de la demande.
Aidez-moi, s'il vous plaît, en fournissant vos précieux conseils et solutions. Je n'ai aucune idée comment faire ça. Je suis complètement coincé avec cela depuis deux jours. S'il vous plaît pardonnez si ma question est trop longue. Vos commentaires sont toujours les bienvenus. Faites-moi savoir si mon exigence n'est pas claire. Merci d'avance.
Je l’ai obtenu à partir de ce lien Retrofit2: Modification du corps de la requête dans 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";
}
}
Les dépendances de rattrapage que 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'
Moi aussi j'avais le même problème, j'avais défini JSON comme type @Body lors de la mise à niveau, de sorte que namevaluepair apparaît devant le corps brut et qu'il soit visible à l'intérieur de l'intercepteur . Même si nous enregistrons/corrigeons jsonObject .toString nous voyons la demande comme correcte sans le namevaluepair présenté.
Ce que j’avais fait était de mettre
Call<ResponseBody> getResults(@Body JsonObject variable);
et dans l'appel de la méthode j'ai converti le JSONObject à JsonObject par
new JsonParser().parse(model).getAsJsonObject();