美文网首页
Okhttp3添加公共请求头和添加公共请求参数

Okhttp3添加公共请求头和添加公共请求参数

作者: 失足者 | 来源:发表于2019-05-16 18:14 被阅读0次

本文最新文章请移步:https://www.jianshu.com/p/8cc3de6674d3

在利用okhttp进行网络请求时,通常会用到拦截器Interceptor这个东西。但是为请求链接添加拦截器又分为三种添加,第一种:添加请求头,第二种:GET请求添加公共参数,第三种:POST请求添加公共参数。一下就是添加的方法

首先创建一个类实现Interceptor:public class HttpInterceptorimplements Interceptor{}

然后就是各个添加的方法:

最后在OkhttpClient中添加拦截器:

添加请求头方法:

/*//新请求(为什么说新操作是从旧请求里面提取内容信息)

Request.Builder requestBuilder=oldRequest.newBuilder();

requestBuilder.method(oldRequest.method(),oldRequest.body());

//将公共参数添加到请求头header中去

if (mHeaderParamsMap.size()>0){//如果添加了请求头公共参数,Map.size>0

//遍历集合,将参数添加到请求头header中

for (Map.Entry params:mHeaderParamsMap.entrySet()){

requestBuilder.header(params.getKey(),params.getValue());

}

}

//将公共参数添加到请求头后,建立新请求连接

Request newRequest=requestBuilder.build();*/

GET请求添加公共参数方法:

//获取并判断网络请求的方法

String method=oldRequest.method();

if (method.equals("GET")&&mUrlParamsMap.size()>0){//判断,并且判断是否有添加公共参数请求

//添加公共参数,构建一个新的httpurl请求链接

    HttpUrl modifieUrl=null;//注意:就算下面没有添加公共参数成功,也会执行下去的

//遍历map集合,将公共参数添加到url中

    for (Map.Entry params:mUrlParamsMap.entrySet()){

modifieUrl=oldRequest.url().newBuilder()

.addQueryParameter(params.getKey(),params.getValue())

.build();

    }

//初始化新的request请求链接

    newRequest=oldRequest.newBuilder().url(modifieUrl).build();

    //再次发起网络请求,并获得返回的结果

    Response response=chain.proceed(newRequest);

    String content=response.body().string();//拿到返回结果的内容,进行分析

//获得返回结果的类型

    MediaType contentType=response.body().contentType();

    //生成新的response返回。注意:如果网络请求的response,如果去除后直接返回,将会抛异常

//注意:response只去一次值,取完后立即清空销毁,所以最好别在这打印日志

    return response.newBuilder()

.body(ResponseBody.create(contentType,content))

.build();

}

POST请求添加公共参数方法:

if (method.equals("POST")){

if (oldRequest.body()instanceof FormBody){

FormBody.Builder bodyBuilder=new FormBody.Builder();

        FormBody formBody= (FormBody) oldRequest.body();

        for (Map.Entry params:mUrlParamsMap.entrySet()){

formBody=bodyBuilder//POST请求方法添加公共参数

                    .add(params.getKey(),params.getValue())

.build();

        }

newRequest=oldRequest.newBuilder().post(formBody).build();

        Response response=chain.proceed(newRequest);

        String content=response.body().string();

        MediaType contentType=response.body().contentType();

        return response.newBuilder()

.body(ResponseBody.create(contentType,content))

.build();

    }

}

最后这里把整个代码贴上来:

package com.example.liyun.joy.serviceutils;

import java.io.IOException;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Map;

import okhttp3.FormBody;

import okhttp3.HttpUrl;

import okhttp3.Interceptor;

import okhttp3.MediaType;

import okhttp3.Request;

import okhttp3.Response;

import okhttp3.ResponseBody;

/**

* 公共拦截器

* 向请求连接添加公共参数和请求头

*/

public class HttpInterceptorimplements Interceptor {

//创建map集合,将添加的公共参数保存到map中

    private MapmUrlParamsMap=new HashMap<>();

    /*//创建map集合,保存添加到请求头的公共参数,添加公共请求头也一样

private Map mHeaderParamsMap=new HashMap<>();*/

    @Override

    public Responseintercept(Chain chain)throws IOException {

//获得请求连接

        Request oldRequest=chain.request();//旧连接

        Request newRequest;//添加公共参数后的新连接

        /**

* 这个时添加请求头的

*/

        /*//新请求(为什么说新操作是从旧请求里面提取内容信息)

Request.Builder requestBuilder=oldRequest.newBuilder();

requestBuilder.method(oldRequest.method(),oldRequest.body());

//将公共参数添加到请求头header中去

if (mHeaderParamsMap.size()>0){//如果添加了请求头公共参数,Map.size>0

//遍历集合,将参数添加到请求头header中

for (Map.Entry params:mHeaderParamsMap.entrySet()){

requestBuilder.header(params.getKey(),params.getValue());

}

}

//将公共参数添加到请求头后,建立新请求连接

Request newRequest=requestBuilder.build();*/

//获取并判断网络请求的方法

        String method=oldRequest.method();

        if (method.equals("GET")&&mUrlParamsMap.size()>0){//判断,并且判断是否有添加公共参数请求

//添加公共参数,构建一个新的httpurl请求链接

            HttpUrl modifieUrl=null;//注意:就算下面没有添加公共参数成功,也会执行下去的

//遍历map集合,将公共参数添加到url中

            for (Map.Entry params:mUrlParamsMap.entrySet()){

modifieUrl=oldRequest.url().newBuilder()

.addQueryParameter(params.getKey(),params.getValue())

.build();

            }

//初始化新的request请求链接

            newRequest=oldRequest.newBuilder().url(modifieUrl).build();

            //再次发起网络请求,并获得返回的结果

            Response response=chain.proceed(newRequest);

            String content=response.body().string();//拿到返回结果的内容,进行分析

//获得返回结果的类型

            MediaType contentType=response.body().contentType();

            //生成新的response返回。注意:如果网络请求的response,如果去除后直接返回,将会抛异常

//注意:response只去一次值,取完后立即清空销毁,所以最好别在这打印日志

            return response.newBuilder()

.body(ResponseBody.create(contentType,content))

.build();

        }else if (method.equals("POST")){

if (oldRequest.body()instanceof FormBody){

FormBody.Builder bodyBuilder=new FormBody.Builder();

                FormBody formBody= (FormBody) oldRequest.body();

                for (Map.Entry params:mUrlParamsMap.entrySet()){

formBody=bodyBuilder//POST请求方法添加公共参数

                            .add(params.getKey(),params.getValue())

.build();

                }

newRequest=oldRequest.newBuilder().post(formBody).build();

                Response response=chain.proceed(newRequest);

                String content=response.body().string();

                MediaType contentType=response.body().contentType();

                return response.newBuilder()

.body(ResponseBody.create(contentType,content))

.build();

            }

}

return chain.proceed(oldRequest);

    }

/**

*创建一个静态类,用于添加公共参数到map集合缓存

*/

    public static class Builder{

//创建拦截器对象,得到Map存储添加进来的公共参数

        HttpInterceptormHttpInterceptor;

        public Builder(){//构造方法中初始话拦截器

            mHttpInterceptor=new HttpInterceptor();

        }

/**

* 将公共参数添加到map集合

        * @param key

        * @param value

        * @return

        */

        public BuilderaddUrlParams(String key,String value){

mHttpInterceptor.mUrlParamsMap.put(key,value);

return this;

        }

public BuilderaddUrlParams(String key,double value){

return addUrlParams(key,String.valueOf(value));

        }

public BuilderaddUrlParams(String key,int value){

return addUrlParams(key,String.valueOf(value));

        }

public BuilderaddUrlParams(String key,long value){

return addUrlParams(key,String.valueOf(value));

        }

public BuilderaddUrlParams(String key,float value){

return addUrlParams(key,String.valueOf(value));

        }

/**

* 返回建立拦截器

        * @return

        */

        public HttpInterceptorbuild(){

return mHttpInterceptor;

        }

}

}

小小的尝试,希望对各位有用,如果又哪里需要改正的地方,请多多指教!谢谢

参考链接:https://blog.csdn.net/qq_38450133/article/details/81218114

相关文章

网友评论

      本文标题:Okhttp3添加公共请求头和添加公共请求参数

      本文链接:https://www.haomeiwen.com/subject/hekwaqtx.html