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)

  • 2017-12-26 21:10

    请问有具体的使用方法吗?不会把你所有的代码都copy到项目中把

    • 匿名 @ 2018-01-26 10:40

      把jar包导入工程就好了,地址:https://github.com/rohsuton/AsyncHttpHelp/tree/master/libs