2016-03-03 43 views
10

Sto usando il retrofit. Per catturare la risposta sto usando Interceptor:Come cambiare il corpo in risposta OkHttp?

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

qui è il codice di intercettore:

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 

Come cambiare corpo in OkHttp risposta?

+0

Qual è il problema che si trovano ad affrontare? – Rohit5k2

+0

Ho bisogno di impostare questo nuovo JSON in risposta e quindi restituire questa risposta, come farlo? – NickUnuchek

risposta

17

Aggiungere questo

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

dopo la vostra modifica di risposta. jsonObject è il JSON modificato che si desidera restituire.

3

Di seguito è riportata la classe di interferenza di risposta in cui è possibile intercettare la risposta okkhttp e aggiungere la propria risposta. e inviarlo a retrofit.

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 otterrà la risposta modificato qui in 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) { 

      } 
     }); 
0

Come una piccola modifica non vorrei utilizzare il metodo string() causa può essere chiamato solo una volta su questa richiesta. Usi lo response.newBuilder() in modo che altri intercettori lungo la catena possano chiamare string() sul tuo nuovo, ma mi sono ritrovato a perdere un paio d'ore perché in realtà lo chiamavo due volte: P.

Quindi suggerisco qualcosa di simile al seguente

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

      });