How to change body in OkHttp Response?
我正在使用改造。要使用拦截器捕获响应,请执行以下操作:
1 2 | OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(myinterceptor); |
这是拦截器的代码:
1 2 3 4 5 6 7 8 9 10 | 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响应中更改正文?
添加此
1 2 3 | MediaType contentType = response.body().contentType(); ResponseBody body = ResponseBody.create(contentType, jsonObject); return response.newBuilder().body(body).build(); |
修改响应后。
下面是Response Intercepter类,您可以在其中拦截okkhttp响应并添加自己的响应。并将其发送给改装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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; } } |
现在,您将在改造回调中得到修改后的响应
1 2 3 4 5 6 7 8 9 10 11 | 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) { } }); |
作为一个较小的更改,我不会使用
所以我建议类似以下内容
1 2 3 4 |
这是添加一个将JSON修改为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | client.addInterceptor(chain -> { final Request request = chain.request(); final String path = request.url().uri().getPath(); final Response response = chain.proceed(request); String body = response.body().string(); final JsonElement element = new JsonParser().parse(body); if ("/the/endpoint/you/want/to/modify".equals(path)){ final JsonObject object = element.getAsJsonObject(); // v v v v v v All this for these lines v v v v v v v object.addProperty("some_json_name","some_json_value"); object.addProperty("existing_property","updated_value"); object.addProperty("numbers_work_too",1.2); // ^ ^ ^ ^ ^ ^ All this for these lines ^ ^ ^ ^ ^ ^ ^ body = object.toString(); } return response.newBuilder().body(ResponseBody.create(response.body().contentType(), body)).build(); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | JSONObject postdata = new JSONObject(); try { postdata.put("citizenId","2222222222222"); postdata.put("accuracy", 3043.323); postdata.put("provider","wifi"); postdata.put("gpsTime", 1111111111111L); postdata.put("lat", 23434.564); postdata.put("lng", 34343.5445); postdata.put("appId","201"); } catch(JSONException e){ // TODO Auto-generated catch block e.printStackTrace(); } RequestBody body = RequestBody.create(MEDIA_TYPE,postdata.toString()); HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); final OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); // final OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); final Request request = new Request.Builder() .url(base_url) .post(body) .addHeader("Content-Type","application/json") .addHeader("Authorization","JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvd25lcklkIjoyLCJvd25lclR5cGUiOiJMRUFERVIiLCJpYXQiOjE1MDE4Mjc4MDMsImV4cCI6MzMwMzc4Mjc4MDMsImF1ZCI6InNlbmRpdC5hc2lhIiwiaXNzIjoic2VsZiJ9.3Gpn3beZfdYsMOLTjksLwmxyfbrfqiojdm1n-gh6CXY") .addHeader("cache-control","no-cache") .build(); client.newCall(request).enqueue(new Callback() { @SuppressLint("LongLogTag") @Override public void onResponse(Call call, Response response) throws IOException { try { // response = client.newCall(request).execute(); // Protocol protocol = response.protocol(); // assertEquals(Protocol.HTTP_1_1, protocol); // 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")); 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()); 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")); Log.e("response body responseBodyString", body.string()); Log.e("response body responseBodyString ", responseBodyString); } catch (JSONException e) { e.printStackTrace(); } Log.e("response", String.valueOf(response)); Log.e("response body", String.valueOf(response.body())); } }catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call call, IOException e) { Log.e("response onFailure", String.valueOf(e)); } }); |