Okhttp请求拦截器

Okhttp请求拦截器

1.新建拦截器,实现Interceptor接口

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

2.获取Request对象

Request original = chain.request();

3.获取、修改HttpUrl对象

HttpUrl url = original.url();

//获得url中key值为name的参数值
String name = url.queryParameter("name");
//添加参数
HttpUrl newUrl = url.newBuilder()
        .addQueryParameter("key","value")
        .build();

4.获取、修改Body对象

//获取、添加body参数
if (original.body() instanceof FormBody){
    FormBody oldBody = (FormBody) original.body();
    FormBody.Builder bodyBuilder = new FormBody.Builder();
    //添加参数
    bodyBuilder.add("key","value");
    for (int i = 0; i < oldBody.size(); i ++){
        String key = oldBody.encodedName(i);
        String value = oldBody.encodedValue(i);
    }
}

5.添加请求头

//获取、修改请求头
Headers headers = original.headers();
Headers newHeader = headers.newBuilder()
        .add("X-Access-Token", MyApplication.getInstance().getToken())
        .build();
Request.Builder builder = original.newBuilder()
                .headers(newHeader);

6.修改Request对象

Request.Builder builder = original.newBuilder()
                .headers(newHeader);
Request request = builder.build();
Response response = chain.proceed(request);

完整拦截器代码

public class MyInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();

        HttpUrl url = original.url();

        //获得url中key为name的参数值
        String name = url.queryParameter("key");

        //添加参数
        HttpUrl newUrl = url.newBuilder()
                .addQueryParameter("key","value")
                .build();

        //获取、添加body参数
        if (original.body() instanceof FormBody){
            FormBody oldBody = (FormBody) original.body();
            FormBody.Builder bodyBuilder = new FormBody.Builder();
            //添加参数
            bodyBuilder.add("key","value");

            for (int i = 0; i < oldBody.size(); i ++){
                String key = oldBody.encodedName(i);
                String value = oldBody.encodedValue(i);
            }
        }

        //获取、修改请求头
        Headers headers = original.headers();
        Headers newHeader = headers.newBuilder()
                .add("X-Access-Token", MyApplication.getInstance().getToken())
                .build();


        Request.Builder builder = original.newBuilder()
                .headers(newHeader);

        Request request = builder.build();

        Response response = chain.proceed(request);

        return response;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 在做处理网络请求的时候,可以直观的看到每次请求的传参和响应是非常有帮助的。 请求的拦截器非常简单 而响应的拦截器需...
    pdog18阅读 7,328评论 2 2
  • 这篇文章主要讲 Android 网络请求时所使用到的各个请求库的关系,以及 OkHttp3 的介绍。(如理解有误,...
    小庄bb阅读 1,233评论 0 4
  • 关于okhttp是一款优秀的网络请求框架,关于它的源码分析文章有很多,这里分享我在学习过程中读到的感觉比较好的文章...
    蕉下孤客阅读 3,625评论 2 38
  • 黄恩翎只觉整个人像是被人刚从湖水里捞出来一样浑身出透了汗。此刻她大脑一片空白,紧张的连动都不敢动。 柏杨突然收回了...
    王伟应阅读 495评论 3 1