要使用拦截器首先要熟悉okhttp的使用,如果不熟悉那么拦截器也会很难懂得,先来看okhttp基本使用
1,get的异步请求
这种方式不用再次开启子线程,但回调方法是执行在子线程中,所以在更新UI时还要跳转到UI线程中。
使用示例如下:
private void getDataAsync() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","获取数据成功了");
Log.d("kwwl","response.code()=="+response.code());
Log.d("kwwl","response.body().string()=="+response.body().string());
}
}
});
}
2,post请求的使用方法
Post请求也分同步和异步两种方式,同步与异步的区别和get方法类似,所以此时只讲解post异步请求的使用方法。
使用示例如下:
private void postDataWithParame() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("nickName","lisi");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://www.baidu.com")
.post(formBody.build())//传递请求体,其实就是传递请求的参数和值
.build();
client.newCall(request).enqueue(new Callback() {。。。});//回调方法的使用与get异步请求相同,此时略。
}
上面就是okhtp的基本使用,详细使用请查看这篇文章
http://blog.csdn.net/fightingXia/article/details/70947701
重点拦截器,拦截器的重要作用就不多解释了,网上有很多的文章都和我讲得好,我这里只是熟悉拦截器方法参数作用情况。
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();//获取一个request这个就可以这个.newBuilde()后就可以和okhttp的请求一样
RequestBody body = request.body();//获取一个body这个body就是内容区域 强转为FormBody 就可以拿到参数和参数值
request.url();//得到请求的链接//拿到链接比较是否相同 相同我们可以做把链接更换为另一个链接在做请求
/**
Content-Type: application/x-www-form-urlencoded
Content-Length: 46
Host: 192.168.3.6:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.9.0
*/
//如上面的请求体我们可以写入Content-Type 就可以拿到application/x-www-form-urlencoded 这个内容
request.header("Content-Type");//拿到这个值我们可以做判断修改请求头的值
request.method();//打印请求体如上面注释部分
request.cacheControl();//获取缓存的方法体不大了解
request.isHttps();//判断是否是https链接
chain.proceed(request);//重新定向到这个request方法在发送请求
/**
* 例子
*/
request=request.newBuilder()
.post(request.body())//这里可以动态改变请求的参数
.url(request.url())//如这里结合retrofit使用可以动态改请求的链接
.addHeader("请求头","请求头的值")//这里可以统一请求头,结合retrofit使用就可以不用再写请求头了嘻嘻
.build();
//用处很多就看你的想象力了
return chain.proceed(request);
}
自己自定义一个类继承Interceptor 重写intercept方法如加密操作
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
RequestBody body = request.body();//获取一个body这个body就是内容区域
if (body instanceof FormBody){
/**
* 这里就是我在是用okhttp的post请求传入body的参数类型吗?,嘻嘻
* 有人会问拿到这个有什么作用,作用大了例:对其进行加密处理,因为有时候很多东西我们不希望后台人员看到
* 这些东西是明码值的情况如:登陆的情况。虽然后台也会加密但是我加密一次岂不是更保险(自己yy的)实际情况还得看
* 项目的规定
*拿到这些 值后我就可以从新组合成一个json数据对json数据进行加密
*/
FormBody formBody = (FormBody) body;
formBody.name("参数")//传入的参数 如上面的例子 这里拿到的就是"nickName" 参数
formBody.value("参数值")//传入的参数值 这里拿到的是:"lisi" 值
// 从 formBody 中拿到请求参数,放入 formMap 中
Map<String ,Object> formMap=new HashMap<>();
for (int i = 0; i < formBody.size(); i++) {
formMap.put(formBody.name(i),formBody.value(i));
}
//将 formMap 转化为 json 然后 进行 加密
Gson gson=new Gson();
String json = gson.toJson(formMap);
//对json 这个字符串就行
/**
* 加密操作
*/
String encryptParams=加密后的到的字符串;
//重新修改bod的内容
body=new FormBody.Builder().add("content",encryptParams).build();
//重新得到这个body在从新发送请求
if (null!=body){
request=request.newBuilder()
.post(body)
.build();
}
}
return chain.proceed(request);
}
解密操作请看这篇文章:
https://www.jianshu.com/p/01c43c3aa6bc