wake-up-neo.com

Wie ändere ich den Körper in OkHttp Response?

Ich benutze Nachrüstung. Um die Antwort abzufangen, verwende ich Interceptor:

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

hier ist der Code des Interceptors:

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

Wie ändere ich den Körper in OkHttp Response?

14
NickUnuchek

Füge das hinzu 

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

nach Ihrer Antwortänderung. jsonObject ist der modifizierte JSON, den Sie zurückgeben möchten.

26
Rohit5k2

Nachfolgend finden Sie die Klasse Response Intercepter, in der Sie die Antwort von okkhttp abfangen und Ihre eigene Antwort hinzufügen können. und senden Sie es zum Nachrüsten.

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

Sie erhalten Ihre modifizierte Antwort hier in Ihrem Retrofit-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) {

            }
        });
7
Aniket

Als geringfügige Änderung würde ich die string()-Methode nicht verwenden, da sie bei dieser Anforderung nur einmal aufgerufen werden kann. Sie verwenden response.newBuilder(), damit andere Interzeptoren in der Kette string() mit Ihrem neuen aufrufen können, aber ich verschwendete ein paar Stunden, weil ich sie tatsächlich zweimal aufgerufen hatte: 

Ich schlage also etwas wie das Folgende vor

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"));
2
linakis
   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));
                }

            });
0
Pong Petrung