Android网络请求库-AsyncHttpHelp
网络请求在APP开发过程中很常见,基本上每个APP都涉及到网络请求,可以说网络请求库是APP的基础组件之一。网上关于支持http请求的网络库很多,各有各的特点,我这里基于okhttp封装了一个,简单易用,能满足普通APP开发的所有需求,并且SDK很小,只有70K左右。
由于Android 6.0系统以后不再集成HttpClient库,AsyncHttpHelp 3.0开始基于OkHttp封装,AsyncHttpHelp 3.0以下是基于HttpClient封装的,有需要可以到这里查看。
一、AsyncHttpHelp概述
网上有很多开源的网络库,为什么我选择自己造轮子呢?主要因为网络库是app都要长期使用的,自己开发可以深入了解网络传输的原理,使用过程中遇到问题随时可以修复,避免出现使用别人的库后期没人维护的处境;另外比较好的开源库功能太全,很多功能平时根本用不到,自己开发的功能相对单一,满足常用功能,够用即可。
优点:
- 功能齐全,提供常用的http网络访问接口。
- 轻量级,无任何第三方库依赖,库大小为70K左右。
- 定制化,自定义json解析库,支持请求参数,返回内容预处理。
- 易用性,简单易用,只需几行代码即可完成请求,可随意设置cookie、http头部等信息。实现文件上传下载非常简单,只需要几行代码就可以搞定。
常用功能:
- 支持简单get/post请求,即提交和返回数据为任意字符串
- 支持form表单格式提交数据,即入参以键值方式传输
- 支持byte数组格式数据传输
- 支持json数据格式内容传输,json与java对象之间自动映射,支持自定义json解析库)
- 支持普通文件上传/下载,并且支持同时上传多个文件
- 支持文件断点上传/下载
- 支持自定义http头部信息
- 支持自定义https证书
- 支持取消单个请求
- 支持请求内容,返回内容预处理
- 支持设置请求后的业务处理是否在UI线程中处理。
二、使用说明
AsyncHttpHelp对外提供的接口使用了链式的设计思想,代码简洁易懂、按需调用、使用方便。
2.1 公用方法
所有的请求支持都有一些通用的功能,以下为公用方法:
- url(String url) — 设置请求url地址
- tag(String tag) — 为请求设置一个tag
- mainThread(boolean mainThread) — 设置请求后的数据业务逻辑是否在主线程处理
- addUrlParams(Map<String, String> urlParams) — 增加多个url参数
- addUrlParam(String key, String value) — 增加单个url参数
- addHeaderParams(Map<String, String> headerParams) — 增加多个header信息
- addHeaderParam(String key, String value) — 增加单个header信息
- connectTimeout(int connectTimeout) — 设置单个请求的链接超时时间
- readTimeout(int readTimeout) — 设置单个请求的读取数据超时时间
- writeTimeout(int writeTimeout) — 设置单个请求的写数据超时时间
- userAgent(String userAgent) — 设置UA信息
2.2 简单Get请求
简单get请求支持自定义header、url参数等,返回内容一般为普通字符串,如果返回的内容为json并且需要支持json自动映射成java对象,只需要把结果回调StringRequestCallable改成JsonResponseHandler。
long id = AsyncHttpUtil.get() .url(url) .addHeaderParams(heads) .userAgent(userAgent) .tag("tag") .mainThread(true) .build().request(new StringRequestCallable() { @Override public void onFailed(int errorCode, String errorMsg) { } @Override public void onSuccess(String responseInfo) { } });
2.3 简单post请求
简单post请求支持自定义header、url信息以及body内容,body内容可以是任意字符串,返回内容是任意字符串,如果返回结果是json并且需要自动转换成java对象,跟get请求返回json对象类似处理。
long id = AsyncHttpUtil.post() .url(url) .addHeaderParams(heads) .userAgent(userAgent) .body("body内容") .tag("tag") .mainThread(true) .build().request(new StringRequestCallable() { @Override public void onFailed(int errorCode, String errorMsg) { } @Override public void onSuccess(String responseInfo) { } });
2.4 post表单请求
post表单请求是比较常用的功能,需要上传的内容使用键值表单的方式传输,同样支持自定义头部信息、url参数以及表单内容,返回的结果可以是普通字符串也可以返回json并自动映射成java对象。
long id = AsyncHttpUtil.post() .url(url) .addHeaderParams(heads) .userAgent(userAgent) .body("body内容") .tag("tag") .mainThread(true) .build().request(new StringRequestCallable() { @Override public void onFailed(int errorCode, String errorMsg) { } @Override public void onSuccess(String responseInfo) { } });
2.5 post 字节数组请求
有时可能有这种需求,传的内容不是字符串,而字节数组,这种场景可以使用这个接口。
long id = AsyncHttpUtil.postBytes() .url(url) .addHeaderParams(heads) .userAgent(userAgent) .buffer(new byte[]{0x01}) .tag("tag") .mainThread(true) .build().request(new StringRequestCallable() { @Override public void onSuccess(String responseBody) { } @Override public void onFailed(int errorCode, String errorMsg) { } });
2.6 json请求
在APP开发过程中,这种场景应该使用最多,即请求内容和返回结果都是json字符串,为方便开发我们会把请求参数和返回结果的模型定义成对象,需要使用json库自动映射。
long id = AsyncHttpUtil.postJson() .mainThread(true) .url(url) .addHeaderParams(heads) .userAgent(userAgent) .tag("tag") .mainThread(true) .reqObj(req) .requestInterceptor(new JsonRequestInterceptor() { @Override public String convertJsonToObj(Object requestObj) { return JSON.toJSONString(requestObj); } }) .responseClazz(DefaultRsp.class) .responseInterceptor(new MyJsonResponseInterceptor<DefaultRsp>()) .build().request(new JsonRequestCallable<DefaultRsp>() { @Override public void onSuccess(DefaultRsp responseInfo) { } @Override public void onFailed(int errorCode, String errorMsg) { } });
2.7 文件下载
大部分app中都有下载的功能,使用我们这个库下载文件非常简单,很少的代码即可搞定。如果需要断点下载,设置offset设置续下载开始位置即可
long id = AsyncHttpUtil.downloadFile() .mainThread(true) .url(url) .addHeaderParams(heads) .userAgent(userAgent) .tag("tag") //.offset()//断点下载时开始下载的位置 .mainThread(true) .fileDir(tempFile.getParentFile().getAbsolutePath()) .fileName(tempFile.getName()) .build().request(new DownloadRequestCallable() { @Override public void onFailed(int i, String s) { } @Override public void onTransfering(long totalLength, long transferedLength) { //下载进度 } @Override public void onSuccess() { } });
2.8 上传文件
使用我们的网络库上传文件也非常简单。如果需要同时上传多个文件,只需要使用addFile添加即可,如果需要断点上传,使用addFile(String key, FileWrapper value)方法,在FileWrapper中设置每个文件上传的起始位置和结束位置即可。
long id = AsyncHttpUtil.uploadFile() .mainThread(true) .url(url) .addHeaderParams(heads) .userAgent(userAgent) .tag("tag") .addFile("file", file) .addFormParams(formDatas) .build().request(new UploadRequestCallable() { @Override public void onFailed(int i, String s) { } @Override public void onSuccess(String responseInfo) { } });
三、总结
怎么样?使用起来是不是很简单,很方便。相信很多新手实现文件上传下载时很头疼,不知道怎么实现,特别是实现断点上传下载的时候,使用AsyncHttpHelp的话你只需要几行代码就可以搞定。
AsyncHttphelp源码地址:github
如有疑问可联系作者:hi@luoxudong.com
转载请注明出处:http://www.luoxudong.com/?p=241
评论(2)
请问有具体的使用方法吗?不会把你所有的代码都copy到项目中把
把jar包导入工程就好了,地址:https://github.com/rohsuton/AsyncHttpHelp/tree/master/libs