NoHttp详解之NoHttp最原生使用(无封装)

来源:互联网 发布:淘宝客服如何做到秒回 编辑:程序博客网 时间:2024/05/20 18:46

参考博客:     点击打开链接

 

  1. NoHttp详细文档:http://doc.nohttp.net

  2. NoHttp公益测试接口:http://api.nohttp.net

  3.  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作为网络层:
compile 'com.yolanda.nohttp:nohttp:1.1.0'
如果要使用OkHttp作为网络层,请再依赖:

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

初始化

NoHttp初始化需要一个Context,最好在ApplicationonCreate()中初始化,记得在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的所有请求包括依赖此activityfragment都是用这个队列即可,在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

0 0
原创粉丝点击