2016-03-03 58 views
10

Używam modernizacji. Złapać odpowiedź Używam Interceptor:Jak zmienić ciało w reakcji OkHttp?

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

Oto kod z kolektora:

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 

Jak zmienić ciało w OkHttp Response?

+0

co jest problemem stoją? – Rohit5k2

+0

Muszę ustawić ten nowy json na odpowiedź, a następnie zwrócić odpowiedź, jak to zrobić? – NickUnuchek

Odpowiedz

17

Dodaj

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

po modyfikacji odpowiedzi. jsonObject to zmodyfikowany JSON, który chcesz zwrócić.

3

Poniżej znajduje się klasa Response Berło, w której można przechwycić odpowiedź okkhttp i dodać własną odpowiedź. i wysłać go do modernizacji.

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 dostanie swoją zmodyfikowaną odpowiedź tutaj w modernizacji zwrotnego

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) { 

      } 
     }); 
0

Jako drobne zmiany nie będę wykorzystać metodę string() przyczyną może być wywołana tylko raz na tę prośbę. Używasz response.newBuilder(), aby inne przechwytniki w dół łańcucha mogły zadzwonić pod numer string(), ale traciłem kilka godzin, ponieważ dwukrotnie dzwoniłem do niego: P.

więc proponuję coś podobnego następującym

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

      });