18

在执行操作之前,我需要获取请求正文并使用 Retrofit 2.0 执行一些逻辑enque操作。但不幸的是,我无法从我的服务电话中获取帖子正文内容。目前,经过大量搜索后,我只找到了一个解决方案,例如我使用该方法使用 Retrofit 2.0通过使用with发布logging的解决方案。我正在使用以下代码在 Android Logcat 中记录请求正文:requestHttpLoggingInterceptorOkHttpClient

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

但是上述方法只返回 logcat 中的响应正文,我无法将其作为Stringor获取JSONObject。即使我能够使用 获取响应正文HttpLoggingInterceptor,即使在应用程序投入生产之后,我的请求正文也会一直显示在带有“OkHttp”标签的 Logcat 中(所以这主要是一种缓解帖子的方式logcat 中的数据)。

我的要求:

我需要以或任何方法获取请求正文,StringJSONObject无需修改 Logcat 中的发布数据。

我尝试了什么:

onResponse即使在from之后,我也尝试获取请求正文Response<T> response,但是尽管我无法完成它。请找到我用于此目的的代码如下:

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

注意:上述转换后的请求体 usinggson.toJson方法只返回元数据,不返回请求 post 数据。

请通过提供您宝贵的提示和解决方案来帮助我。我不知道该怎么做。在过去的两天里,我完全被这个问题所困扰。如果我的问题太长,请原谅。欢迎你提出任何建议。如果我的要求不清楚,请告诉我。提前致谢。

4

2 回答 2

56

我已经从这个链接 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";
            }
        }

我正在使用的改造依赖项是

 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'
于 2016-02-04T10:33:26.150 回答
0

我也有类似的问题,我在改造中将 JSON 设置为 @Body 类型,所以 namevaluepair 出现在原始正文前面,并且可以在拦截器中看到。即使我们记录/调试 jsonObject.toString 我们看到请求是正确的,但没有提供名称值对。

我所做的是通过设置

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

在调用该方法时,我将 JSONObject 转换为 JsonObject

 new JsonParser().parse(model).getAsJsonObject();
于 2016-12-14T12:18:51.850 回答