NoHttp介绍

作者对该框架这样介绍
Android Http标准框架,底层OkHttp,与RxJava完美结合,比Retrofit更简单易用。

框架特性

  • 动态配置底层框架为OkHttp、HttpURLConnection
  • 与RxJava完美结合,支持异步请求、支持同步请求
  • 多文件上传,支持大文件上传,表单提交数据
  • 文件下载、上传下载、上传和下载的进度回调、错误回调
  • 支持Json、xml、Map、List的提交
  • 完美的Http缓存模式,可指定缓存到数据库、SD卡,缓存数据已安全加密
  • 自定义Request,直接请求JsonObject、JavaBean等
  • Cookie的自动维持,App重启、关开机后还持续维持
  • http 301 302 303 304 307、重定向,支持多层嵌套重定向
  • Https、自签名网站Https的访问、支持双向验证
  • 失败重试机制,支持请求优先级
  • GET、POST、PUT、PATCH、HEAD、DELETE、OPTIONS、TRACE等请求协议
  • 用队列保存请求,平均分配多线程资源,支持多个请求并发
  • 支持取消某个请求,取消指定多个请求,取消所有请求

使用方法

1. 添加依赖

  • 如果使用HttpURLConnection作为网络层:

    compile 'com.yolanda.nohttp:nohttp:1.1.0'

  • 如果要使用OkHttp作为网络层,请再依赖:

    compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'

2. 初始化

NoHttp初始化需要一个Context,最好在Application的onCreate()中初始化,记得在manifest.xml中注册Application。

  • 简单初始化

    1
    NoHttp.initialize(this);
  • 高级自定义初始化

    • 超时配置,默认10s

      1
      2
      3
      4
      5
      6
      NoHttp.initialize(this, new NoHttp.Config()
      // 设置全局连接超时时间,单位毫秒
      .setConnectTimeout(30 * 1000)
      // 设置全局服务器响应超时时间,单位毫秒
      .setReadTimeout(30 * 1000)
      );
    • 默认缓存,默认保存在数据库

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      NoHttp.initialize(this, new NoHttp.Config()
      ...
      // 保存到数据库
      .setCacheStore(
      new DBCacheStore(this).setEnable(true) // 如果不使用缓存,设置false禁用。
      )
      // 或者保存到SD卡
      .setCacheStore(
      new DiskCacheStore(this)
      )
      );
    • 默认Cookie保存的位置,默认保存在数据库

      1
      2
      3
      4
      5
      6
      7
      NoHttp.initialize(this, new NoHttp.Config()
      ...
      // 默认保存数据库DBCookieStore,开发者可以自己实现。
      .setCookieStore(
      new DBCookieStore(this).setEnable(false) // 如果不维护cookie,设置false禁用。
      )
      );
    • 配置网络层

      1
      2
      3
      4
      5
      6
      7
      NoHttp.initialize(this, new NoHttp.Config()
      ...
      // 使用HttpURLConnection
      .setNetworkExecutor(new URLConnectionNetworkExecutor())
      // 使用OkHttp
      .setNetworkExecutor(new OkHttpNetworkExecutor())
      );

3. 需要权限

1
2
3
4
5
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

4. 友好的调试模式

1
2
Logger.setDebug(true);// 开启NoHttp的调试模式, 配置后可看到请求过程、日志和错误信息。
Logger.setTag("NoHttpSample");// 设置NoHttp打印Log的tag。

开启NoHttp的调试模式后可看到请求过程、日志和错误信息,基本不用抓包。可以看到请求头、请求数据、响应头、Cookie等,而且打印出的Log非常整齐。

5. 第三方异步框架

RxJava 可以与RxJava、RxAndroid、RxBus、EventBus等第三方异步任务框架完美结合使用,这里在demo中给出了和RxJava一起使用的代码。具体的封装请参考Demo的RxNoHttp。

1
2
3
4
5
6
7
8
9
Request<UserInfo> request = new JavaBeanRequest<>(url, UserInfo.class);
RxNoHttp.request(this, request, new SimpleSubscriber<Response<UserInfo>>() {
@Override
public void onNext(Response<YanZhenjie> entityResponse) {
// 直接拿到实体对象
UserInfo userInfo = entiryResponse.get();
}
});
`

请求队列

1
2
3
4
5
RequestQueue requestQueue = NoHttp.newRequestQueue();
// 如果要指定并发值,传入数字即可:NoHttp.newRequestQueue(3);
// 发起请求
requestQueue.add(what, request, responseListener);