关于OKHTTP添加公共参数或请求加签名

关于OKHTTP添加公共参数或请求加签名,第1张

关于OKHTTP拦截器Interceptor很强大,很好用。因为公司有个需求需要对所有请求接口添加共有参数并且对共有参数进行签名。在OKHTTP中GET的请求参数和POST表单形式的参数很容易获取,但是对于BODY类型的一时没想到解决办法,后来想了想发现其实都是可以做的。

GET方法直接url.request().query()即可获得key=value&key=value形式的参数,可以直接拼凑参数,然后签名。

POST方法:有三种情况,表单,body,multipart三种情况,对于multipart主要是文件,一般过滤掉。

重要源码:

if (requestBody instanceof FormBody) {for (int i =0i <((FormBody) requestBody).size()i++) {rootMap.put(((FormBody) requestBody).encodedName(i), ((FormBody) requestBody).encodedValue(i))}} else {//buffer流Buffer buffer = new Buffer()requestBody.writeTo(buffer)String oldParamsJson = buffer.readUtf8()rootMap = mGson.fromJson(oldParamsJson, HashMap.class) //原始参数rootMap.put("publicParams", commomParamsMap) //重新组装String newJsonParams = mGson.toJson(rootMap) //装换成json字符串request = request.newBuilder().post(RequestBody.create(JSON, newJsonParams)).build()}

具体靠参考:http://blog.csdn.net/wuyinlei/article/details/57087872

dependencies{

//...

//OkHttp

implementation'com.squareup.okhttp3:okhttp:3.14.2'

implementation'com.squareup.okio:okio:1.17.4'

}

需要注意OkHttp在3.13.x以上的版本需要在Android 5.0+和java1.8的环境开发。Okio在1.x版本是基于Java实现的,2.x则是Kotlin实现的。

OkHttpClient:客户端对象

Request:访问请求,Post请求中需要包含RequestBody

RequestBody:请求数据,在Post请求中用到

Response:网络请求的响应结果

Interceptor:拦截器,能够监控,重写以及重试(请求的)调用

MediaType:数据类型,用来表明数据是json,image,pdf等一系列格式

client.newCall(request).execute():同步的请求方法。

client.newCall(request).enqueue(Callback callback):异步的请求方法

注意点:Callback是执行在子线程中的,不能在此更新UI *** 作,okhttp2.2以后才有拦截器的概念。

1.同步get:需要自己写子线程请求

2.异步get

说明:Request.Builder 中默认使用get请求,所以可以不调用get()方法

3.post请求

其中RequestBody可以是JSON,表单,键值对,文件等

表单

基本流程都是先创建一个OkHttpClient对象,然后通过Request.Builder()创建一个Request对象,OkHttpClient对象调用newCall()并传入Request对象就能Call对象。而同步和异步不同的地方在于execute()和enqueue()方法的调用,调用execute()为同步请求并返回Response对象,调用enqueue()方法通过callback的形式返回Response对象。

其中这两个方法最终会调用RealCall总的getResponseWithInterceptorChain

()方法,从拦截器链中获取返回结果;拦截器链中,依次通过RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor、ConnectInterceptor、CallServerInterceptor,与服务器建立连接后,获取返回数据,在经过上述拦截器依次处理后,最后将结果返回给调用方。

拦截器的作用:可以在应用拿到response之前,先获得response,对其某些数据进行监控,在有必要的情况下,对response中某些内容比如response的header,body,response内的request的header,body进行更改。

重拾及重定向拦截器RetryAndFollowUpInterceptor: 负责请求的重试和重定向

桥接拦截器BridgeInterceptor:给请求添加对用的header信息,处理响应结果的header信息

缓存拦截器CacheInterceptor:根据当前获取的状态选择网络请求、读取缓存、更新缓存。

连接拦截器ConnectInterceptor:建立http连接。

读写拦截器CallServerInterceptor:通过连接好的通道进行数据的交换;

1)ApplicationInterceptor(应用拦截器)

2)NetworkInterceptor(网络拦截器)

应用拦截器作用于okhttpCore和Application之间,网络拦截器作用于network和okhttpCore之间,添加应用拦截器的接口是addInterceptor(),而添加网络拦截器的接口是addNetworkInterceptor();

NetworkInterceptor:记录日志

ApplicationInterceptor:动态添加请求公共参数,检查请求路径权限(如是否登录状态)

说明:在某些特殊情况下,网络拦截器可能被执行多次,但是applicationInterceptor只会被执行一次。

addHeader(String name, String value) :添加header信息

removeHeader(String name):移除header信息

header(String name, String value):重新设置指定name的header信息

headers(Headers headers):移除原有的header信息,将参数headers添加到请求中

原文: https://blog.csdn.net/sk719887916/article/details/52189602

添加统一通用header, 不会覆盖前面的header

okHttpClient.interceptors().add(new Interceptor() {

    @Override

    public Response intercept(Interceptor.Chain chain) throws IOException {

        Request original = chain.request()

        // Request customization: add request headers

        Request.Builder requestBuilder = original.newBuilder()

                    .addHeader("header-key", "value1")

                    .addHeader("header-key", "value2")

        Request request = requestBuilder.build()

        return chain.proceed(request)

    }

})

添加统一通用header, 会覆盖前面的header

okHttpClient.interceptors().add(new Interceptor() {

    @Override

    public Response intercept(Interceptor.Chain chain) throws IOException {

        Request original = chain.request()

        // Request customization: add request headers

        Request.Builder requestBuilder = original.newBuilder()

                .header("headerkey", "header-value")// <-- this is the important line

        Request request = requestBuilder.build()

        return chain.proceed(request)

    }

})

统一添加参数

OkHttpClient.Builder httpClient =

    new OkHttpClient.Builder()

httpClient.addInterceptor(new Interceptor() { 

    @Override

    public Response intercept(Chain chain) throws IOException {

        Request original = chain.request()

        HttpUrl originalHttpUrl = original.url()

        HttpUrl url = originalHttpUrl.newBuilder()

                .addQueryParameter("apikey", "your-actual-api-key")

                .build()

        // Request customization: add request headers

        Request.Builder requestBuilder = original.newBuilder()

                .url(url)

        Request request = requestBuilder.build()

        return chain.proceed(request)

    }

})


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11407832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存