OkHttp - 拦截器(Interceptor) 重新定义请求 Request

OkHttp拦截器实践
本文介绍如何使用OkHttp拦截器更改请求地址和数据。通过继承Interceptor接口并实现intercept方法,可以获取到Request对象,进而修改请求地址和参数。文章详细展示了如何重新封装参数并生成新的Request对象。

背景

项目使用的OkHttp和Retrofit,但目前要改了新的接口方式,不采用Restful的风格,所以对Retrofit的网络底层实现,是一个致命的打击。这时候就需要在OkHttp上做一些摸索了,即 - 拦截器 (InterCeptor)。

思路

思路很简单:拿到请求的Request对象,改变请求地址和请求数据(or 重新封装),返回新的Request,继续进行请求。

实现

(1)继承 Interceptor 接口,并实现intercept方法

public class NetWorkInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
    }
}

(2)通过chain 对象获取Request对象

   Request request = chain.request();

(3)通过request.body与FormBody 重新封装参数

   if(request.body() instanceof FormBody) {
            FormBody body = (FormBody) request.body();
            if (body.size() > 0) {
                //封装参数
                for (int i = 0; i < body.size(); i++) {
                    Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i));
                    Log.d(TAG, body.name(i) + " >>>> " + body.value(i));
                    params.getP().add(body.encodedValue(i));
                }
            }
        }

(4)通过FormBody.Builder和Request.Builder重新生成Request

 FormBody.Builder newFormBuilder=new FormBody.Builder();
        newFormBuilder.addEncoded(PARAMS_DATA, CryptUtil.enCryPto(params));
        Request.Builder builder=request.newBuilder();
        builder.url(HTTP_HOST_API);
        builder.method(request.method(),newFormBuilder.build());
       Request newRequest= builder.build();

(5)返回 Response

  return chain.proceed(newrequest);

附件 :

具体见 :initRequest方法实现

import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by yuan on 2016/8/5.
 */
public class NetWorkInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Log.d(TAG,request.url().host());

        if(request.url().host().equals(HTTP_OLD_HOST_API)){
            //需要修改
            //通过一些条件进行判断,然后返回新的Request
            switch (request.url().encodedPath()){
                case HTTP_OLD_HOST_BANNER:
                    Request initRequest = initRequest(request, maps.get(HTTP_OLD_HOST_BANNER));
                    return chain.proceed(initRequest);
            }
        }
        return chain.proceed(request);
    }

    /**
     * 重新封装参数
     * @param request 旧的Request
     * @param params 封装的bean
     * @return 修改后的Request
     */
    private Request initRequest(Request request,BaseNetParams params){
        if(request.body() instanceof FormBody) {
            FormBody body = (FormBody) request.body();
            if (body.size() > 0) {
                //封装参数
                for (int i = 0; i < body.size(); i++) {
                    Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i));
                    Log.d(TAG, body.name(i) + " >>>> " + body.value(i));
                    params.getP().add(body.encodedValue(i));
                }
            }
        }
        FormBody.Builder newFormBuilder=new FormBody.Builder();
        newFormBuilder.addEncoded(PARAMS_DATA, params);
        Request.Builder builder=request.newBuilder();
        builder.url(HTTP_HOST_API);
        builder.method(request.method(),newFormBuilder.build());
        return builder.build();
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值