参考博客: 点击打开链接
- NoHttp详细文档:http://doc.nohttp.net
- NoHttp公益测试接口:http://api.nohttp.net
- https://github.com/yanzhenjie/NoHttp
支持与
RxJava
完美结合、支持一句话切换底层为
OkHttp
,支持缓存数据到数据库或SD卡和数据库,并对数据做了加密保护,支持请求Restful风格的接口,比Retrofit更简单易用。
框架特性
- 动态配置底层框架为OkHttp、HttpURLConnection
- 与RxJava完美结合,支持异步请求、支持同步请求
- 多文件上传,支持大文件上传,表单提交数据
- 文件下载、上传下载、上传和下载的进度回调、错误回调
- 支持Json、xml、Map、List的提交
- 完美的Http缓存模式,可指定缓存到数据库、SD卡,缓存数据已安全加密
- 在6.0以上手机缓存到SD卡时需要请求运行时权限:AndPermission
- 自定义Request,直接请求JsonObject、JavaBean等
- Cookie的自动维持,App重启、关开机后还持续维持
- http 301 302 303 304 307重定向,支持多层嵌套重定向
- Https、自签名网站Https的访问、支持双向验证
- 失败重试机制,支持请求优先级
- GET、POST、PUT、PATCH、HEAD、DELETE、OPTIONS、TRACE等请求协议
- 用队列保存请求,平均分配多线程的资源,支持多个请求并发
- 支持取消某个请求、取消指定多个请求、取消所有请求
使用方法
AndroidStudio使用方式
- 如果使用HttpURLConnection作为网络层:
如果要使用OkHttp作为网络层,请再依赖:
初始化
NoHttp初始化需要一个Context,最好在
Application
的
onCreate()
中初始化,记得在
manifest.xml
中注册
Application
。
一般初始化
直接初始化后,一切采用默认设置。
NoHttp.initialize(this);
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//NoHttp初始化
NoHttp.initialize(this);
}
}
get和post请求原生使用:
public class MainActivity extends AppCompatActivity {
private TextView mTv;
/***
* 1.如果是mac,可以安装jsonOnlineView
* 2.如果是windows,postman,google的浏览器chrome的插件
*/
private String postUrl = "https://api.bmob.cn/1/users";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = (TextView) findViewById(R.id.tv);
}
/***
* Nohttp的get方式
* @param view
*/
public void btn_get(View view){
/**可以封装到其他的地方*/
String url = "http://www.baidu.com";
//1.创建一个队列
/**也可以封装,只需要一个队列就够了**/
RequestQueue queue = NoHttp.newRequestQueue();
//3.创建消息请求
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//2.利用队列去添加消息请求
/***
* what:请求的标识
* request:请求
* response:请求的回调监听
*/
/**请求可以并发,统一处理响应结果**/
queue.add(0, request, new OnResponseListener<String>() {
//请求一开始的回调,对话框的加载
@Override
public void onStart(int what) {
}
//成功之后的回调
@Override
public void onSucceed(int what, Response<String> response) {
//设置响应结果
mTv.setText(response.get());
}
//网络请求失败的回调
@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
}
//网络请求完成
@Override
public void onFinish(int what) {
}
});
}
public void btn_post(View view){
RequestQueue queue = NoHttp.newRequestQueue();
Request<String> request = NoHttp.createStringRequest(postUrl, RequestMethod.POST);
request.addHeader("X-Bmob-REST-API-Key","2bfebfad889df974a01ab7867d411f75");
request.addHeader("X-Bmob-Application-Id","cae7c5400719de3e04d708f5c82d94e8");
request.addHeader("Content-Type","application/json");
request.setDefineRequestBodyForJson("{\"username\" : \"1234567890\",\"password\" : \"654321\"}");
// request.add("username","123456");
// request.add("password","123456");
queue.add(1, request, new OnResponseListener<String>() {
@Override
public void onStart(int what) {
}
@Override
public void onSucceed(int what, Response<String> response) {
mTv.setText(response.get());
}
@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
}
@Override
public void onFinish(int what) {
}
});
}
}
基本使用:
特别注意:这里的RequestQueue是请求队列,默认3个并发请求,也就是有3个子线程在跑,所以正式项目中不要每发起一个请求就new一个队列,建议在
BaseActivity#onCreate(Bundle)
中new一个队列即可,这个
activity
的所有请求包括依赖此
activity
的
fragment
都是用这个队列即可,在
BaseActivity#onDestory()
时
stop
这个队列即可,当然特殊情况下可以再new一个Queue出来,也无伤大雅的。
建议读者阅读完下方的代码后再把上面这句话读一遍,会理解的更深刻。
BaseActivity,提供基础的封装
public class BaseActivtiy extends Activity implements View.OnClickListener {
/**
* 请求队列
*/
private RequestQueue mRequestQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建请求队列, 默认并发3个请求, 传入数字改变并发数量: NoHttp.newRequestQueue(5);
mRequestQueue = NoHttp.newRequestQueue();
}
@Override
protected void onDestroy() {
super.onDestroy();
mRequestQueue.cancelAll(); // 退出页面时时取消所有请求。
mRequestQueue.stop(); // 退出时销毁队列,回收资源。
}
/**
* 发起一个请求。
*
* @param what what.
* @param request 请求对象。
* @param listener 结果监听。
* @param <T> 要请求到的数据类型。
*/
public <T> void request(int what, Request<T> request, OnResponseListener<T> listener) {
mRequestQueue.add(what, request, listener);
}
}
在BaseActivity的子类中使用
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
/**
* 请求用户信息。
*/
private void requestUserInfo() {
Request<String> req = NoHttp.createStringRequest(url);
request(0, req, new OnResponseListener<String>() {
@Override
public void onStart(int what) {
// 请求开始,可以显示一个dialog。
}
@Override
public void onSucceed(int what, Response<String> response) {
// 请求成功,这里判断服务器的响应码,假如你们服务器200时,才是业务成功:
Headers headers = response.getHeaders();
if(headers.getResponseCode() == 200) {
String result = response.get(); // 拿到结果。
}
}
@Override
public void onFailed(int what, Response<String> response) {
// 请求失败,具体失败类型,请看nohttp主页的demo。
}
@Override
public void onFinish(int what) {
// 请求结束,关闭dialog。
}
});
}
}
在BaseActivity的子类的Fragment中使用
public class MainFragment extends Fragment {
/**
* 请求用户信息。
*/
private void requestUserInfo() {
Request<String> req = NoHttp.createStringRequest(url);
((MainActivity)getActivity()).request(0, req, new OnResponseListener<String>() {
@Override
public void onStart(int what) {
// 请求开始,可以显示一个dialog。
}
@Override
public void onSucceed(int what, Response<String> response) {
// 请求成功,这里判断服务器的响应码,假如你们服务器200时,才是业务成功:
Headers headers = response.getHeaders();
if(headers.getResponseCode() == 200) {
String result = response.get(); // 拿到结果。
}
}
@Override
public void onFailed(int what, Response<String> response) {
// 请求失败,具体失败类型,请看nohttp主页的demo。
}
@Override
public void onFinish(int what) {
// 请求结束,关闭dialog。
}
});
}
}
下一篇,nohttp的封装版。
如果想学习更多的使用方法,建议参考Demo:https://github.com/yanzhenjie/NoHttp
更多使用介绍请阅读NoHttp文档:doc.nohttp.net