okhttp探索(一)

okhttp详解

由于最近在研究项目框架,对于网络请求框架感觉在使用上还是不够熟练,此次在以前总结的笔记基础上再次总结下,下面的总结参考博客资料颇多,都是从网上一些大神哪里参考着学习的。

1,OkHttp是什么?
要学习一项知识要知其然,更知其所以然的态度去学,而不是马马虎虎的去看一下,知道并不等于会。众所周知okhttp是android中的一个网络请求库框架,由Square公司贡献,用于替代HttpClient Apache和HttpUrlConnection。可是,okhttp之前的被替代者你了解吗?
2,为什么要开发okttp去替代之前的框架?

1, HttpClient Apache基金会开源网络库,功能强大,API众多,但也因此导致API数量过多,很难在不破坏兼容性的情况下进行升级或者拓展。

2,HttpUrlConnection 多用途,轻量级,api简单,并且还有压缩和缓存机制因此可以轻易扩展与升级,由于Android2.2版本之前存在bug,比如连接池失效问题(产生原因InputStream调用close(),解决方法禁用连接池),所以推荐2.2之前使用HttpClient,并且从Android4.4起底层默认由httpURLConnection换成了okhttp.

通过上面的简单说明我们可以知道,Okhttp与上面两者相比,一句话总结就是通过把很多重复代码做好相关封装处理,更易于扩展和使用。

3,okhttp的特点是什么?
1,除了一般的get,post请求,还支持GZIP压缩,请求缓存,链接同一个地址,共享一个socket以减少响应延迟。
2,其核心特点在于路由,代理,安全认证,拦截器,协议,网络适配等等。后面会一一说明。

小知识:
 1,关于get,post请求区别?
  get请求是一种向服务器获取数据的请求,它只能获取而不能修改数据,数据拼接再URL后面,空格转换为+,中文字符或其他字符会被转化为Base64位编码字符发送,这种方式易被抓包或者再浏览器上被别人查看到明文密码.post请求是对服务器上的数据进行修改的请求,理论上长度没有限制,看实际对接设置,数据可以进行加密传输.

 2,关于http请求操作的流程
  1,三次握手
  2,关于TCP/IP协议有兴趣的可以点击这里查看 TCP/IP
  3,推荐一下《图解HTTP》

4,okhttp简单使用

终于到了代码时刻.哈哈,等不及的小伙伴可以在git上看demo okhttp

as中导入

compile 'com.squareup.okhttp3:okhttp:3.9.1'

基本使用方法
1,创建okhttpClient对象
2,创建一个Request
3,new call
4,请求加入调度,分为同步和异步.注意:这里说的同步是指不得在主线程下同步调用.

来继续看代码:

OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url("http://www.baidu.com/").build();
        mCallback = okHttpClient.newCall(request);
//同步请求

//      Response reponse= mCallback.execute();


//异步请求
        mCallback.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {

                    }});

注意:

Okhttp3.0之后,execute.body.string()这个方法只能调用一次,切记,否则会抛出异常
Caused by: java.lang.IllegalStateException: closed

返回结果

//异步
08-17 16:04:44.025 19913-20061/com.example.okhttptest E/mrgao: call:okhttp3.RealCall@ca30c6d,response:Response{protocol=http/1.1, code=200, message=OK, url=http://www.baidu.com/}
//同步
08-17 16:11:35.745 20389-20428/com.example.okhttptest E/mrgao: execute:Response{protocol=http/1.1, code=200, message=OK, url=http://www.baidu.com/}

上面默认是属于get请求哦,下面来看一下post请求,当然这段是摘抄示例,我们可以看到用户名上传的post请求,通过创建FormEncodingBuilder对象来添加用户名,然后通过request发起post请求,并再CallBack中返回响应结果.

    Request request = buildMultipartFormRequest(url, new File[]{file}, new String[]{fileKey}, null);
    FormEncodingBuilder builder = new FormEncodingBuilder();   
    builder.add("username","hehe");
    Request request = new Request.Builder().url(url).post(builder.build()).build();
    mOkHttpClient.newCall(request).enqueue(new Callback(){});

 Gson解析

User user = gson.fromJson(response.body().User(),API.class);

 通过上面的简单使用我们可以发现okhttp的缺点,在进行数据请求之后,不能直接在该线程进行数据展示,还需要切换到主线程进行刷新UI操作,如果请求获得数据比较复杂还需要自己去封装一套合适的框架.所以下一篇我们来介绍下如何去封装一套可以在开发中快速使用的okhttp网络请求框架.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值