Получение содержимого тела запроса с использованием метода POST-метода Retofit 2.0

У меня есть требование получить тело запроса и выполнить некоторые логические операции с Retrofit 2.0 перед выполнением операции enque. Но, к сожалению, я не могу получить содержание тела сообщения из моего служебного вызова. В настоящее время после многого поиска я нашел только одно решение, подобное logging request, которое я отправляю с помощью Retrofit 2.0 из этого метода с помощью HttpLoggingInterceptor с OkHttpClient. Я использую следующий код для регистрации тела запроса в 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);

Проблема: я сталкиваюсь с указанным выше способом:

  • Тело запроса просматривается только по умолчанию для Android Logcat, например

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

Но вышеупомянутый метод возвращает только тело ответа в logcat, я не могу получить его как String или JSONObject. Несмотря на то, что если я смогу получить тело ответа с помощью HttpLoggingInterceptor, мое тело запроса будет отображаться в Logcat с тегом "OkHttp" все время даже после того, как приложение войдет в производство (так что в первую очередь это ведет к тому, освобождение данных сообщения в логарифме).

Мои требования:

Мне нужно получить тело запроса как String или JSONObject или любой другой метод без оскорбления почтовых данных в Logcat.

Что я пробовал:

Я попытался получить тело запроса даже после onResponse из Response<T> response, но, хотя я не смог сделать это возможным. Пожалуйста, найдите код, который я использую для этой цели, следующим образом:

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

Примечание. Вышеуказанный преобразованный тело запроса с использованием метода gson.toJson возвращает только метаданные, а не данные сообщения запроса.

Просьба помочь мне в этом, предоставив ценные советы и решения. Я не знаю, как это сделать. Я полностью застрял с этим в течение последних двух дней. Пожалуйста, простите, если мой вопрос слишком длинный. Ваши комментарии всегда приветствуются. Дайте мне знать, если мои требования не ясны. Спасибо заранее.

Ответ 1

У меня есть работа по этой ссылке Retrofit2: изменение тела запроса в перехватчике OkHttp

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

Модифицированные зависимости, которые я использую, - это

 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'

Ответ 2

У меня тоже была аналогичная проблема, я установил JSON как тип @Body в модификации, так что имяvaluepair появляется перед сырым телом, и это можно увидеть внутри перехватчика. Несмотря на то, что, если мы регистрируем/отлаживаем jsonObject.toString, мы считаем запрос корректным без представленной пары namevaluepair.

Что я сделал, установив

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

и при вызове метода я преобразовал JSONObject в JsonObject на

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