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

参考博客:     点击打开链接

 

  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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NoHttp 是专门做Android网络请求与下载的框架。支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载;支持304缓存,302/303重定向,支持代理服务器。NoHttp特性:支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。使用Gradle构建时添加依赖:// 引用最新版 compile 'com.yolanda.nohttp:nohttp: ' // 或则引用指定版本 compile 'com.yolanda.nohttp:nohttp:1.0.0'一. 请求1.请求String数据// 请求对象 Request request = NoHttp.createStringRequest(url, requestMethod); //添加请求头 request.addHeader("AppVersioin", "2.0"); // 添加请求参数 request.add("userName", "yolanda"); //上传文件 request.add("file", new FileBinary(file)); ...2.请求Json数据// JsonObject Request request = NoHttp.createJsonObjectRequest(url, reqeustMethod); queue.add(what, request, responseListener); … // JsonArray Request request = NoHttp.createJsonArrayRequest(url, reqeustMethod); queue.add(what, request, responseListener);3. 请求Bitmap数据Request request = NoHttp.createImageRequest(url, requestMethod); ...4. 取消请求取消单个请求Request request = NoHttp.createStringRequest(url); ... request.cancel();从队列中取消指定的请求Request request = NoHttp.createStringRequest(url); request.setCancelSign(sign); … queue.cancelBySign(sign);取消队列中所有请求queue.cancelAll();停止队列RequestQueue queue = NoHttp.newRequestQueue(); ... queue.stop();5. 同步请求// 在当前线程发起请求,在线程这么使用 Request request = NoHttp.createStringRequest(url); Response response = NoHttp.startRequestSync(request); if (response.isSucceed()) {     // 请求成功 } else {     // 请求失败 }二. 缓存1. Http标准协议的缓存,比如响应码是304时现在很多公司使用了RESTFUL风格来写Http API,所以这个是必须有的。Request request = NoHttp.createJsonObjectRequest(url); // NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT request.setCacheMode(CacheMode.DEFAULT); ...2. 当请求服务器失败的时候,读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); ...3. 如果发现有缓存直接成功,没有缓存才请求服务器我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常使用做一个ImageLoader。Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...请求图片,缓存图片。// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示 Request request = NoHttp.createImageRequest(imageUrl); request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...4. 仅仅读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为ONLY_READ_CACHE request.setCacheMode(CacheMode.ONLY_READ_CACHE); ...注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存二、响应OnResponseListener responseListener = new OnResponseListener() {     @Override     public void onStart(int what) {         // 请求开始时,可以显示一个Dialog     }     @Override     public void onFinish(int what) {         // 请求接受时,关闭Dialog     }     @Override     public void onSucceed(int what, Response response) {         // 接受请求结果         String result = response.get();         // Bitmap imageHead = response.get(); // 如果是bitmap类型,都是同样的用法     }     @Override     public void onFailed(int what, String url, Object tag, Exception exception, ...) {         // 请求失败或者发生异常         // 这里根据exception处理不同的错误,比如超时、网络不好等     } };三. 自定义请求类型: FastJsonRequest1.定义请求对象public class FastJsonRequest extends RestRequestor { public FastJsonRequest(String url) {     super(url); } public FastJsonRequest(String url, RequestMethod requestMethod) {     super(url, requestMethod); } @Override public JSONObject parseResponse(String url, Headers headers, byte[] responseBody) {     String result = StringRequest.parseResponseString(url, headers, responseBody);     JSONObject jsonObject = null;     if (!TextUtils.isEmpty(result)) {         jsonObject = JSON.parseObject(result);     } else {         // 这里默认的错误可以定义为你们自己的数据格式         jsonObject = JSON.toJSON("{}");     }     return jsonObject; } @Override public String getAccept() {     // 告诉服务器你接受什么类型的数据, 会添加到请求头的Accept中     return "application/json;q=1"; } }2.使用自定义请求-和NoHttp默认请求没有区别Request mRequest = new FastJsonRequest(url, requestMethod); queue.add(what, mRequest, responseListener);五. 下载文件发起下载请求//下载文件 downloadRequest = NoHttp.createDownloadRequest(url, fielDir, fileName, true, false); // what 区分下载 // downloadRequest 下载请求对象 // downloadListener 下载监听 CallServer.getDownloadInstance().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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值