Retrofit2: Modifying request body in OkHttp Interceptor

前端 未结 4 1917
遥遥无期
遥遥无期 2020-12-01 15:37

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

4条回答
  •  Happy的楠姐
    2020-12-01 16:31

    Since this cannot be written in the comments of the previous answer by @Fabian, I am posting this one as separate answer. This answer deals with both "application/json" as well as form data.

    import android.content.Context;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.IOException;
    
    import okhttp3.FormBody;
    import okhttp3.Interceptor;
    import okhttp3.MediaType;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okio.Buffer;
    
    /**
     * Created by debanjan on 16/4/17.
     */
    
    public class TokenInterceptor implements Interceptor {
        private Context context; //This is here because I needed it for some other cause 
    
        //private static final String TOKEN_IDENTIFIER = "token_id";
        public TokenInterceptor(Context context) {
            this.context = context;
        }
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            RequestBody requestBody = request.body();
            String token = "toku";//whatever or however you get it.
            String subtype = requestBody.contentType().subtype();
            if(subtype.contains("json")){
                requestBody = processApplicationJsonRequestBody(requestBody, token);
            }
            else if(subtype.contains("form")){
                requestBody = processFormDataRequestBody(requestBody, token);
            }
            if(requestBody != null) {
                Request.Builder requestBuilder = request.newBuilder();
                request = requestBuilder
                        .post(requestBody)
                        .build();
            }
    
            return chain.proceed(request);
        }
        private 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";
            }
        }
        private RequestBody processApplicationJsonRequestBody(RequestBody requestBody,String token){
            String customReq = bodyToString(requestBody);
            try {
                JSONObject obj = new JSONObject(customReq);
                obj.put("token", token);
                return RequestBody.create(requestBody.contentType(), obj.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        private RequestBody processFormDataRequestBody(RequestBody requestBody, String token){
            RequestBody formBody = new FormBody.Builder()
                    .add("token", token)
                    .build();
            String postBodyString = bodyToString(requestBody);
            postBodyString += ((postBodyString.length() > 0) ? "&" : "") +  bodyToString(formBody);
            return RequestBody.create(requestBody.contentType(), postBodyString);
        }
    
    }
    

提交回复
热议问题