熟悉使用okhttp和拦截器使用

要使用拦截器首先要熟悉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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值