Android开发之OkHttpUtils的具体使用方法
一、概述
之前写了篇android okhttp完全解析 是时候来了解okhttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中的方法也是剧增,各种重载方法,以致于使用起来极不方便,实在惭愧。
于是,在这个周末,抽点时间对该工具类,进行了重新的拆解与编写,顺便完善下功能,尽可能的提升其使用起来的方便性和易扩展性。
ok,那么目前,该封装库志支持:
- 一般的get请求
- 一般的post请求
- 基于http的文件上传
- 文件下载
- 上传下载的进度回调
- 加载图片
- 支持请求回调,直接返回对象、对象集合
- 支持session的保持
- 支持自签名网站https的访问,提供方法设置下证书就行
- 支持取消某个请求
源码地址:https://github.com/hongyangandroid/okhttp-utils
引入:
android studio
使用前,对于android studio的用户,可以选择添加:
compile project(':okhttputils')
或者
compile 'com.zhy:okhttputils:2.0.0'
二、基本用法
目前基本的用法格式为:
okhttputils .get() .url(url) .addparams("username", "hyman") .addparams("password", "123") .build() .execute(callback);
通过链式去根据自己的需要添加各种参数,最后调用execute(callback)进行执行,传入callback则代表是异步。如果单纯的execute()则代表同步的方法调用。
可以看到,取消了之前一堆的get重载方法,参数也可以进行灵活的选择了。
下面简单看一下,全部的用法:
(1)get请求
string url = "http://www.csdn.net/"; okhttputils .get() .url(url) .addparams("username", "hyman") .addparams("password", "123") .build() .execute(new stringcallback() { @override public void onerror(request request, exception e) { } @override public void onresponse(string response) { } });
(2)post请求
okhttputils .post() .url(url) .addparams("username", "hyman") .addparams("password", "123") .build() .execute(callback);
(3)post string
okhttputils .poststring() .url(url) .content(new gson().tojson(new user("zhy", "123"))) .build() .execute(new mystringcallback());
将string作为请求体传入到服务端,例如json字符串。
(4)post file
okhttputils .postfile() .url(url) .file(file) .build() .execute(new mystringcallback());
将file作为请求体传入到服务端.
(5)基于post的文件上传(类似web上的表单)
okhttputils.post()// .addfile("mfile", "messenger_01.png", file)// .addfile("mfile", "test1.txt", file2)// .url(url) .params(params)// .headers(headers)// .build()// .execute(new mystringcallback());
(6)下载文件
okhttputils// .get()// .url(url)// .build()// .execute(new filecallback(environment.getexternalstoragedirectory().getabsolutepath(), "gson-2.2.1.jar")// { @override public void inprogress(float progress) { mprogressbar.setprogress((int) (100 * progress)); } @override public void onerror(request request, exception e) { log.e(tag, "onerror :" + e.getmessage()); } @override public void onresponse(file file) { log.e(tag, "onresponse :" + file.getabsolutepath()); } });
(7)显示图片
okhttputils .get()// .url(url)// .build()// .execute(new bitmapcallback() { @override public void onerror(request request, exception e) { mtv.settext("onerror:" + e.getmessage()); } @override public void onresponse(bitmap bitmap) { mimageview.setimagebitmap(bitmap); } });
哈,目前来看,清晰多了。
三、对于上传下载的回调
new callback<?>() { //... @override public void inprogress(float progress) { //use progress: 0 ~ 1 } }
对于传入的callback有个inprogress方法,需要拿到进度直接复写该方法即可。
四、对于自动解析为实体类
目前去除了gson的依赖,提供了自定义callback的方式,让用户自己去解析返回的数据,目前提供了stringcallback,filecallback,bitmapcallback 分别用于返回string,文件下载,加载图片。
当然如果你希望解析为对象,你可以:
public abstract class usercallback extends callback<user> { //非ui线程,支持任何耗时操作 @override public user parsenetworkresponse(response response) throws ioexception { string string = response.body().string(); user user = new gson().fromjson(string, user.class); return user; } }
自己使用自己喜欢的json解析库完成即可。
解析成list<user>,则如下:
public abstract class listusercallback extends callback<list<user>> { @override public list<user> parsenetworkresponse(response response) throws ioexception { string string = response.body().string(); list<user> user = new gson().fromjson(string, list.class); return user; } }
五、对于https单向认证
非常简单,拿到xxx.cert的证书。
然后调用
okhttputils.getinstance() .setcertificates(inputstream);
建议使用方式,例如我的证书放在assets目录:
/** * created by zhy on 15/8/25. */ public class myapplication extends application { @override public void oncreate() { super.oncreate(); try { okhttputils .getinstance() .setcertificates(getassets().open("aaa.cer"), getassets().open("server.cer")); } catch (ioexception e) { e.printstacktrace(); } } }
即可。别忘了注册application。
注意:如果https网站为权威机构颁发的证书,不需要以上设置。自签名的证书才需要。
六、配置
(1)全局配置
可以在application中,通过:
okhttpclient client = okhttputils.getinstance().getokhttpclient();
然后调用client的各种set方法。
例如:
client.setconnecttimeout(100000, timeunit.milliseconds);
(2)为单个请求设置超时
比如涉及到文件的需要设置读写等待时间多一点。
okhttputils .get()// .url(url)// .tag(this)// .build()// .conntimeout(20000) .readtimeout(20000) .writetimeout(20000) .execute()
调用build()之后,可以随即设置各种timeout.
(3)取消单个请求
requestcall call = okhttputils.get().url(url).build(); call.cancel()
(4)根据tag取消请求
目前对于支持的方法都添加了最后一个参数object tag,取消则通过okhttputils.canceltag(tag)执行。
例如:在activity中,当activity销毁取消请求:
okhttputils .get()// .url(url)// .tag(this)// .build()// @override protected void ondestroy() { super.ondestroy(); //可以取消同一个tag的 okhttputils.canceltag(this);//取消以activity.this作为tag的请求 }
比如,当前activity页面所有的请求以activity对象作为tag,可以在ondestory里面统一取消。
七、浅谈封装
其实整个封装的过程比较简单,这里简单描述下,对于okhttp一个请求的流程大致是这样的:
//创建okhttpclient对象 okhttpclient mokhttpclient = new okhttpclient(); //创建一个request final request request = new request.builder() .url("https://github.com/hongyangandroid") .build(); //new call call call = mokhttpclient.newcall(request); //请求加入调度 call.enqueue(new callback() { @override public void onfailure(request request, ioexception e) { } @override public void onresponse(final response response) throws ioexception { //string htmlstr = response.body().string(); } });
其中主要的差异,其实就是request的构建过程。
我对request抽象了一个类:okhttprequest
public abstract class okhttprequest { protected requestbody requestbody; protected request request; protected string url; protected string tag; protected map<string, string> params; protected map<string, string> headers; protected okhttprequest(string url, string tag, map<string, string> params, map<string, string> headers) { this.url = url; this.tag = tag; this.params = params; this.headers = headers; } protected abstract request buildrequest(); protected abstract requestbody buildrequestbody(); protected void prepareinvoked(resultcallback callback) { requestbody = buildrequestbody(); requestbody = wraprequestbody(requestbody, callback); request = buildrequest(); } protected requestbody wraprequestbody(requestbody requestbody, final resultcallback callback) { return requestbody; } public void invokeasyn(resultcallback callback) { prepareinvoked(callback); mokhttpclientmanager.execute(request, callback); } // other common methods }
一个request的构建呢,我分三个步骤:buildrequestbody , wraprequestbody ,buildrequest这样的次序,当以上三个方法没有问题时,我们就拿到了request,然后执行即可。
但是对于不同的请求,requestbody以及request的构建过程是不同的,所以大家可以看到buildrequestbody ,buildrequest为抽象的方法,也就是不同的请求类,比如okhttpgetrequest、okhttppostrequest等需要自己去构建自己的request。
对于wraprequestbody方法呢,可以看到它默认基本属于空实现,主要是因为并非所有的请求类都需要复写它,只有上传的时候呢,需要回调进度,需要对requestbody进行包装,所以这个方法类似于一个钩子。
其实这个过程有点类似模板方法模式。
对于更加详细的用法,可以查看github上面的readme,以及demo,目前demo包含:
对于上传文件的两个按钮,需要自己搭建服务器,其他的按钮可以直接测试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Photoshop设计制作逼真创意的彩色粉笔字教程
下一篇: 用jsp页面生成随机的验证数字码示例