本文共 10603 字,大约阅读时间需要 35 分钟。
NoHttp详细文档:
NoHttp公益测试接口:
支持与RxJava
完美结合、支持一句话切换底层为OkHttp
,支持缓存数据到或SD卡和数据库,并对数据做了加密保护,支持请求Restful风格的接口,比Retrofit更简单易用。
欢迎加入QQ技术交流群:
compile 'com.yolanda.nohttp:nohttp:1.1.0'
compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'
如果使用OkHttp做为网络层
好多jar啊,所以强烈的999次方建议没有使用AndroidStudio
的同学赶紧切换过来。
NoHttp初始化需要一个Context,最好在Application
的onCreate()
中初始化,记得在manifest.xml
中注册Application
。
直接初始化后,一切采用默认设置。
NoHttp.initialize(this);
NoHttp.initialize(this, new NoHttp.Config() // 设置全局连接超时时间,单位毫秒 .setConnectTimeout(30 * 1000) // 设置全局服务器响应超时时间,单位毫秒 .setReadTimeout(30 * 1000) );
NoHttp.initialize(this, new NoHttp.Config() ... // 保存到数据库 .setCacheStore( new DBCacheStore(this).setEnable(true) // 如果不使用缓存,设置false禁用。 ) // 或者保存到SD卡 .setCacheStore( new DiskCacheStore(this) ) );
NoHttp.initialize(this, new NoHttp.Config() ... // 默认保存数据库DBCookieStore,开发者可以自己实现。 .setCookieStore( new DBCookieStore(this).setEnable(false) // 如果不维护cookie,设置false禁用。 ) );
NoHttp.initialize(this, new NoHttp.Config() ... // 使用HttpURLConnection .setNetworkExecutor(new URLConnectionNetworkExecutor()) // 使用OkHttp .setNetworkExecutor(new OkHttpNetworkExecutor()) );
Logger.setDebug(true);// 开启NoHttp的调试模式, 配置后可看到请求过程、日志和错误信息。Logger.setTag("NoHttpSample");// 设置NoHttp打印Log的tag。
开启NoHttp的调试模式后可看到请求过程、日志和错误信息,基本不用抓包。可以看到请求头、请求数据、响应头、Cookie等,而且打印出的Log非常整齐。
所以说,如果你使用过程中遇到什么问题了,开启调试模式,一切妖魔鬼怪都会现形的。
RxJava
可以与RxJava、RxAndroid、RxBus、EventBus等第三方异步任务框架完美结合使用,这里在demo中给出了和RxJava一起使用的代码。具体的封装请参考Demo的RxNoHttp。Requestrequest = new JavaBeanRequest<>(url, UserInfo.class);RxNoHttp.request(this, request, new SimpleSubscriber >() { @Override public void onNext(Response entityResponse) { // 直接拿到实体对象 UserInfo userInfo = entiryResponse.get(); } });
RequestQueue requestQueue = NoHttp.newRequestQueue();// 如果要指定并发值,传入数字即可:NoHttp.newRequestQueue(3);// 发起请求requestQueue.add(what, request, responseListener);
responseLisetener
响应时回调给开发者,所以开发者可以用一个responseLisetener
接受多个请求的响应,用what来区分结果。而不用像有的框架一样,每一个请求都要new一个callback。Requestrequest = NoHttp.createStringRequest(url, RequestMethod.GET);requestQueue.add(0, request, listener);
// JsonObjectRequestobjRequest = NoHttp.createJsonObjectRequest(url, RequestMethod.POST);requestQueue.add(0, objRequest, listener);// JsonArrayRequest arrayRequest = NoHttp.createJsonArrayRequest(url, RequestMethod.PUT);requestQueue.add(0, arrayRequest, listener);
Requestrequest = NoHttp.createImageRequest(url, RequestMethod.DELETE);requestQueue.add(0, request, listener);
// FastJsonRequestrequest = new FastJsonRequest(url, RequestMethod.POST);requestQueue.add(0, request, listener);
// 内部使用Gson、FastJson解析成JavaBeanRequestrequest = new JavaBeanRequest(url, RequestMethod.GET);requestQueue.add(0, request, listener);
Requestrequest = new JavaBeanRequest(url, RequestMethod.POST); .add("name", "yoldada") // String类型 .add("age", 18) // int类型 .add("sex", '0') // char类型 .add("time", 16346468473154) // long类型 // 添加Bitmap .add("head", new BitmapBinary(bitmap)) // 添加File .add("head", new FileBinary(file)) // 添加ByteArray .add("head", new ByteArrayBinary(byte[])) // 添加InputStream .add("head", new InputStreamBinary(inputStream))
文件上传实现了http表单的标准协议,满足了广大开发者的需求,有以下几种形式:
Requestrequest = ...request.add("file", new FileBinary(file));
Requestrequest = ...request.add("file1", new FileBinary(File));request.add("file2", new FileBinary(File));request.add("file3", new InputStreamBinary(InputStream)); request.add("file4", new ByteArrayBinary(byte[])); request.add("file5", new BitmapBinary(Bitmap));
Requestrequest = ...fileList.add("image", new FileBinary(File));fileList.add("image", new InputStreamBinary(InputStream));fileList.add("image", new ByteArrayBinary(byte[])); fileList.add("image", new BitmapBinary(Bitmap));
或者:
Requestrequest = ...List fileList = ...fileList.add(new FileBinary(File));fileList.add(new InputStreamBinary(InputStream));fileList.add(new ByteArrayBinary(byte[]));fileList.add(new BitmapStreamBinary(Bitmap)); request.add("file_list", fileList);
提交Body分为提交Json、提交String、提交Xml、提交流等,具体用法如下:
// 提交普通Stringrequest.setDefineRequestBody(String, ContentType);// 提交json字符串request.setDefineRequestBodyForJson(JsonString)// 提交jsonObject对象,其实还是json字符串request.setDefineRequestBodyForJson(JSONObject)// 提交xml字符串request.setDefineRequestBodyForXML(XmlString)// 提交字体Body,比如File(这跟表单上传不一样的),可以转为InputStream来提交 request.setDefineRequestBody(InputStream, ContentType)
在当前线程发起请求,在线程这么使用。
Requestrequest = NoHttp.createStringRequest(url, RequestMethod.DELETE);Response response = NoHttp.startRequestSync(request);if (response.isSucceed()) { // 请求成功} else { // 请求失败 }
NoHttp的缓存非常强大,支持缓存到数据库、换到SD卡等,并且不论缓存在数据库或者SD,NoHttp都把数据进行了加密,需要在初始化的时候配置缓存的位置。
需要注意的是,在6.0以上的手机中如果要缓存在SD卡,需要在请求之前,需要请求运行时权限,如果你不懂运行时权限,可以看这个项目:。
NoHttp.initialize(this, new NoHttp.Config() ... // 保存到数据库 .setCacheStore( new DBCacheStore(this).setEnable(true) // 如果不使用缓存,设置false禁用。 ) // 或者保存到SD卡 .setCacheStore( new DiskCacheStore(this) ) );
Requestrequest = NoHttp.createJsonObjectRequest(url);request.setCacheMode(CacheMode.DEFAULT);
Requestrequest = NoHttp.createJsonObjectRequest(url);request.setCacheMode(CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE);
请求String,缓存String:
Requestrequest = NoHttp.createJsonObjectRequest(url);// 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST_NETWORKrequest.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
请求图片,缓存图片:
Requestrequest = NoHttp.createImageRequest(imageUrl);request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
Requestrequest = NoHttp.createImageRequest(imageUrl);request.setCacheMode(CacheMode.ONLY_REQUEST_NETWORK);...
Requestrequest = NoHttp.createImageRequest(imageUrl);request.setCacheMode(CacheMode.ONLY_READ_CACHE);
因为下载文件代码比较多,这里贴关键部分,具体的请参考demo。
文件下载也是队列,队列和开头所说的请求的队列是一样的。
//下载文件downloadRequest = NoHttp.createDownloadRequest...// what 区分下载// downloadRequest 下载请求对象// downloadListener 下载监听downloadQueue.add(0, downloadRequest, downloadListener);
downloadRequest.cancel();
private DownloadListener downloadListener = new DownloadListener() { @Override public void onStart(int what, boolean resume, long preLenght, Headers header, long count) { // 下载开始 } @Override public void onProgress(int what, int progress, long downCount) { // 更新下载进度 } @Override public void onFinish(int what, String filePath) { // 下载完成 } @Override public void onDownloadError(int what, StatusCode code, CharSequence message) { // 下载发生错误 } @Override public void onCancel(int what) { // 下载被取消或者暂停 } };
NoHttp支持取消某个请求、取消指定多个请求、取消所有请求。
request.cancel();
request1.setCancelSign(sign);request2.setCancelSign(sign);...// 取消队列中多个用sign标志的请求queue.cancelBySign(sign);
queue.cancelAll();
队列停止后再添加请求到队列后,请求不会被执行。
RequestQueue queue = NoHttp.newRequestQueue();...queue.stop();
NoHttp的所有自带请求都是继承RestRequest
类,所以我们自定义请求也需要继承RestRequest
,泛型写自己想要请求的数据类型,最后在parseResponse()
方法中解析服务器数据成自己自己想要的数据类型即可。
public class FastJsonRequest extends RestRequestor{ public FastJsonRequest(String url) { this(url, RequestMethod.GET); } public FastJsonRequest(String url, RequestMethod requestMethod) { super(url, requestMethod); } @Override public JSONObject parseResponse(Headers header, byte[] body) throws Throwable { String result = StringRequest.parseResponseString(headers, body); return JSON.parseObject(result); } }
public class JavaBeanRequestextends RestRequest { private Class clazz; public JavaBeanRequest(String url, Class clazz) { this(url, RequestMethod.GET, clazz); } public JavaBeanRequest(String url, RequestMethod requestMethod, Class clazz) { super(url, requestMethod); this.clazz = clazz; } @Override public T parseResponse(Headers header, byte[] body) throws Throwable { String response = StringRequest.parseResponseString(header, body); // 这里如果数据格式错误,或者解析失败,会在失败的回调方法中返回 ParseError 异常。 return JSON.parseObject(response, clazz); } }
// 使用FastJson自定义请求Requestrequest = new FastJsonRequest(url, requestMethod);queue.add(what, mRequest, listener);...// 直击请求JavaBeanRequest request = new JavaBeanRequest(url, UserInfo.class);queue.add(what, request, listener);
NoHttp设计到兼容高版本系统的api采用反射调用,所以所有类都可以被混淆,如果你非要keep的话,如下配置即可。
-dontwarn com.yolanda.nohttp.**-keep class com.yolanda.nohttp.**{*;}
// nohttp-dontwarn com.yolanda.nohttp.**-keep class com.yolanda.nohttp.**{*;} // nohttp-okhttp -dontwarn com.yanzhenjie.nohttp.** -keep class com.yanzhenjie.nohttp.**{*;} // okhttp -dontwarn okhttp3.** -keep class okhttp3.** { *;} -dontwarn okio.**
-keep class okio.** { *;}
本文转自 一点点征服 博客园博客,原文链接:
http://www.cnblogs.com/ldq2016/p/NoHttp.html,如需转载请自行联系原作者