Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit2: Modifying request body in OkHttp Interceptor

I am using Retrofit 2 (2.0.0-beta3) with OkHttp client in Android application and so far everything going great. But currently I am facing issue with OkHttp Interceptor. The server I am communicating with is taking access token in body of request, so when I intercept the request to add auth token or in authenticate method of Authenticator when I need to add updated auth token, I need to modify body of request for this purpose. But it looks like I can only add data in headers but not in the body of ongoing request. The code I have written so far is as follows:

client.interceptors().add(new Interceptor() {             @Override             public Response intercept(Chain chain) throws IOException {                 Request request = chain.request();                 if (UserPreferences.ACCESS_TOKEN != null) {                     // need to add this access token in request body as encoded form field instead of header                     request = request.newBuilder()                             .header("access_token", UserPreferences.ACCESS_TOKEN))                             .method(request.method(), request.body())                             .build();                 }                 Response response = chain.proceed(request);                 return response;             }         }); 

Can anyone point me to the right direction as how to modify request body to add my access token (first time or updated after token refresh)? Any pointer to right direction would be appreciated.

like image 500
Lala Rukh Avatar asked Jan 14 '16 13:01

Lala Rukh


1 Answers

I using this to add post parameter to the existing ones.

 OkHttpClient client = new OkHttpClient.Builder()                     .protocols(protocols)                     .addInterceptor(new Interceptor() {                         @Override                         public Response intercept(Chain chain) throws IOException {                             Request request = chain.request();                             Request.Builder requestBuilder = request.newBuilder(); RequestBody formBody = new FormEncodingBuilder()             .add("email", "[email protected]")             .add("tel", "90301171XX")             .build();                             String postBodyString = Utils.bodyToString(request.body());                             postBodyString += ((postBodyString.length() > 0) ? "&" : "") +  Utils.bodyToString(formBody);                             request = requestBuilder                                     .post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"), postBodyString))                                     .build();                             return chain.proceed(request);                         }                     })                     .build();  public static String bodyToString(final RequestBody request){         try {             final RequestBody copy = request;             final Buffer buffer = new Buffer();             if(copy != null)                 copy.writeTo(buffer);             else                 return "";             return buffer.readUtf8();         }         catch (final IOException e) {             return "did not work";         }     } 

OkHttp3:

RequestBody formBody = new FormBody.Builder()                 .add("email", "[email protected]")                 .add("tel", "90301171XX")                 .build(); 
like image 193
Fabian Avatar answered Sep 28 '22 03:09

Fabian