2016-02-03 3 views
11

У меня есть требование получить тело запроса и выполнить некоторые логические операции с помощью Retrofit 2.0 перед выполнением операции enque. Но, к сожалению, я не могу получить содержание тела сообщения из моего служебного вызова. В настоящее время после многого поиска я нашел только одно решение, такое как loggingrequest, которое я публикую с помощью Retrofit 2.0 от this method, используя HttpLoggingInterceptor с OkHttpClient. Я использую следующий код для входа в тело запроса в Android LogCat:Получение содержимого тела пользователя с использованием Retrofit 2.0 Метод POST

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); 

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

  1. Запрос тела рассматриваются только по умолчанию Android LogCat как

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

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

Мой Требование:

Мне нужно, чтобы получить тело запроса в String или JSONObject или любым другим способом, не злословил почтовые данные в LogCat.

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

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

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

Примечание: выше преобразованное тело запроса с использованием gson.toJson метод возвращает только мета-данные не по просьбе почтовых данных.

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

+0

вы получите решение для этого, м также сталкивается с проблемой с этим – sector11

+0

Пока нет. Дай мне знать, если получишь. – Chandru

ответ

31

Я получил это работает по этой ссылке 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"; 
      } 
     } 

зависимости Retrofit я использую являются

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

спасибо вам большое. Дай мне проверить. – Chandru

+0

Я добавляю следующие версии в build.gradle – Chandru

+0

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

0

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

Что я сделал, было установкой

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

и в призвании метода я перестроивший JSONObject в JSONObject по

new JsonParser().parse(model).getAsJsonObject(); 
Смежные вопросы