如何改变OkHttp Response中的主体?

我正在使用改造。 为了捕获反应,我使用了Interceptor:

OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(myinterceptor); 

这里是拦截器的代码:

 new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); if (path.equals("/user")){ String stringJson = response.body().string(); JSONObject jsonObject = new JSONObject(stringJson); jsonObject.put("key",1); //here I need to set this new json to response and then return this response 

如何改变OkHttp Response中的主体?

Solutions Collecting From Web of "如何改变OkHttp Response中的主体?"

添加这个

 MediaType contentType = response.body().contentType(); ResponseBody body = ResponseBody.create(contentType, jsonObject); return response.newBuilder().body(body).build(); 

在你的回应修改后。 jsonObject是你想要返回的被修改的JSON。

下面是Response Intercepter类,你可以拦截okkhttp响应并添加你自己的响应。 并发送给改造。

 import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.ResponseBody; import retrofit2.Response; public class ApiResponseInterceptor implements Interceptor { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); okhttp3.Response response = chain.proceed(request); if(response.code() == 200) { JSONObject jsonObject = new JSONObject(); try { jsonObject.put("code",200); jsonObject.put("status","OK"); jsonObject.put("message","Successful"); MediaType contentType = response.body().contentType(); ResponseBody body = ResponseBody.create(contentType, jsonObject.toString()); return response.newBuilder().body(body).build(); } catch (JSONException e) { e.printStackTrace(); } } else if(response.code() == 403) { } return response; } } 

Yow会在您的改装callback中得到您的修改回应

 call.enqueue(new Callback<EventResponce>() { @Override public void onResponse(Call<EventResponce> call, Response<EventResponce> response) { // you will get your own modified responce here } @Override public void onFailure(Call<EventResponce> call, Throwable t) { } }); 

作为一个小的改变,我不会使用string()方法,因为它只能在这个请求中调用一次。 你可以使用response.newBuilder()这样链下的其他拦截器就可以调用你的新的拦截器,但是我发现自己浪费了几个小时,因为我实际上调用了两次:P。

所以我build议像下面这样

 BufferedSource source = response.body().source(); source.request(Long.MAX_VALUE); // Buffer the entire body. Buffer buffer = source.buffer(); String responseBodyString = buffer.clone().readString(Charset.forName("UTF-8"));