web-dev-qa-db-fra.com

Obtention du contenu du corps de la demande à l'aide de Retrofit 2.0 POST méthode

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:

  1. Corps de la demande sont visibles uniquement sur le Android Logcat par défaut 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 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.

11
Chandru

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'
43
silentsudo

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();
0
Manoj Perumarath