2016-03-03 8 views
10

Ich benutze Nachrüstung. Zu fangen Antwort ich verwende Interceptor:Wie Körper in OkHttp Antwort ändern?

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

hier ist der Code von Interceptor:

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 Körper in OkHttp Antwort ändern?

+0

Was ist das Problem Sie konfrontiert sind? – Rohit5k2

+0

Ich muss diesen neuen JSON auf die Antwort einstellen und dann diese Antwort zurückgeben, wie geht das? – NickUnuchek

Antwort

17

diese Modifikation

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

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

3

Unten ist Response Intercepter Klasse, wo Sie okkhttp Antwort abfangen und Ihre eigene Antwort hinzufügen können. und senden Sie es zur Nachrüstung.

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 Ihre modifizierte Antwort hier im Retrofit-Rückruf

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

Als geringfügige Änderung bekommen würde ich nicht die string() Methode verwenden, weil es zu diesem Antrag nur einmal aufgerufen werden kann. Sie verwenden die response.newBuilder(), damit andere Interceptors in der Kette string() auf Ihrem neuen anrufen können, aber ich fand mich ein paar Stunden verschwendend, weil ich es tatsächlich zweimal nannte: P.

Deshalb schlage ich vor so etwas wie die folgenden

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

      }); 
Verwandte Themen