在执行enque
操作之前,我需要获取请求主体并使用Retrofit 2.0执行某些逻辑操作。但遗憾的是,我无法通过服务电话获取帖子正文内容。目前经过大量搜索后,我发现只有一个解决方案,例如logging
request
我使用this method使用HttpLoggingInterceptor
和OkHttpClient
使用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);
使用Retrofit 2.0。我使用以下代码在Android Logcat中记录请求正文:
02-04 01:35:59.235 5007-5035/com.example.retrofitdemo D/OkHttp:{"nameValuePairs":{"id":"1","name":"chandru","type":"user"}}
问题我正面对上述方法:
String
但是上面的方法只返回logcat中的响应主体,我无法将其作为JSONObject
或HttpLoggingInterceptor
获取。尽管如果我能够使用String
获得响应主体,我的请求主体将显示在Logcat中,标签为" OkHttp"即使在应用程序进入生产之后,所有的时间总是如此(因此主要是这样可以缓解logcat中的帖子数据)。
我的要求:
我需要将请求正文作为JSONObject
或onResponse
或任何方法获取,而不会在Logcat中修改帖子数据。
我尝试了什么:
我尝试从Response<T> response
Gson gson = new Gson();
String responseString = gson.toJson(response.raw().request().body());
获取请求正文,但我无法完成此任务。请查找我为此目的使用的代码,如下所示:
gson.toJson
注意:上述使用this.add(panel)
方法转换后的请求正文仅返回元数据而非请求发布数据。
请提供宝贵的提示和解决方案,帮助我解决这个问题。我不知道该怎么做。过去两天我完全坚持了这一点。如果我的问题太冗长,请原谅。欢迎你提出任何建议。如果我的要求不明确,请告诉我。提前谢谢。
答案 0 :(得分:46)
我从这个链接开始工作了 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'
答案 1 :(得分:0)
我也有类似的问题,我在改装中将JSON设置为@Body类型,因此namevaluepair出现在原始主体的前面,并且可以在拦截器内看到它。 即使我们记录/调试jsonObject.toString,我们也会在没有显示namevaluepair的情况下看到请求是正确的。
我做的是设置
Call<ResponseBody> getResults(@Body JsonObject variable);
并且在调用方法时我通过
将JSONObject转换为JsonObject new JsonParser().parse(model).getAsJsonObject();