OKRx+OkGo(okhttp-util升级版)网络请求框架使用

来源:互联网 发布:大数据处理算法 编辑:程序博客网 时间:2024/06/16 11:13

OkGo - OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持RxJava

该库是封装了okhttp的标准RESTful风格的网络框架,可以与RxJava完美结合,比Retrofit更简单易用。支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持超时自动重连,支持cookie与session的自动管理,支持四种缓存模式缓存网络数据,支持301、302重定向,扩展了统一的上传管理和下载管理功能。

https://github.com/jeasonlzy/okhttp-OkGo#1%E7%94%A8%E6%B3%95
介绍

1.添加依赖

Android studio

compile 'com.lzy.net:okgo:2.1.4'//可以单独使用,不需要依赖下方的扩展包compile 'com.lzy.net:okrx:0.1.2'//RxJava扩展支持,根据需要添加compile 'com.lzy.net:okserver:1.1.3'//下载管理和上传管理扩展,根据需要添加或者compile 'com.lzy.net:okgo:+'        //版本号使用 + 可以自动引用最新版compile 'com.lzy.net:okrx:+'        //版本号使用 + 可以自动引用最新版compile 'com.lzy.net:okserver:+'    //版本号使用 + 可以自动引用最新版

2.注意事项

okgo使用的okhttp的版本是最新的 3.4.1 版本,和以前的 2.x 的版本可能会存在冲突。
okrx是基于RxJava和RxAndroid的扩展,如果不需要可以不必引入
okserver是对okgo的扩展,统一了下载管理和上传管理,对项目有需要做统一下载的可以考虑使用该扩展,不需要的可以直接使用okgo即可。
对于缓存模式使用,需要与返回对象相关的所有javaBean必须实现Serializable接口,否者会报NotSerializableException。
使用缓存时,如果不指定cacheKey,默认是用url带参数的全路径名为cacheKey。
使用该网络框架时,必须要在 Application 中做初始OkGo.init(this);。

3.OkGo目前支持

一般的 get,post,put,delete,head,options请求
基于Post的大文本数据上传
多文件和多参数统一的表单上传
支持一个key上传一个文件,也可以一个Key上传多个文件
大文件下载和下载进度回调
大文件上传和上传进度回调
支持cookie的内存存储和持久化存储,支持传递自定义cookie
支持304缓存协议,扩展四种本地缓存模式,并且支持缓存时间控制
支持301、302重定向
支持自定义超时自动重连次数
支持链式调用
支持可信证书和自签名证书的https的访问,支持双向认证
支持根据Tag取消请求
支持自定义泛型Callback,自动根据泛型返回对象

4.OkRx扩展功能

OkRx使用文档

https://github.com/jeasonlzy/okhttp-OkGo/blob/master/README_RX.md
完美结合RxJava
比Retrofit更简单方便
网络请求和RxJava调用,一条链点到底
支持Json数据的自动解析转换
OkGo包含的所有请求功能,OkRx全部支持

5.1 统一的文件下载管理(DownloadManager):

结合OkGo的request进行网络请求,支持与OkGo保持相同的全局公共参数,同时支持请求传递参数
支持断点下载,支持突然断网,强杀进程后,断点依然有效
支持 下载 暂停 等待 停止 出错 完成 六种下载状态
所有下载任务按照taskKey区分,切记不同的任务必须使用不一样的key,否者断点会发生覆盖
相同的下载url地址如果使用不一样的taskKey,也会认为是两个下载任务
默认同时下载数量为3个,默认下载路径/storage/emulated/0/download,下载路径和下载数量都可以在代码中配置
下载文件名可以自己定义,也可以不传,框架自动解析响应头或者url地址获得文件名,如果都没获取到,使用default作为文件名

5.2 统一的文件上传管理(UploadManager)

结合OkGo的request进行网络请求,支持与OkGo保持相同的全局公共参数,同时支持请求传递参数
上传只能使用Post, Put, Delete, Options 这四种请求,不支持Get, Head
该上传管理为简单管理,不支持断点续传或分片上传,只是简单的将所有上传任务使用线程池进行了统一管理
默认同时上传数量为1个,该数列可以在代码中配置修改
使用

1.全局配置

一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息

public class MyApp extends Application {    @Override    public void onCreate() {        super.onCreate();        HttpHeaders headers = new HttpHeaders();        HttpParams params = new HttpParams();        //header不支持中文,不允许有特殊字符        headers.put("commonHeaderKey1", "commonHeaderValue1");        headers.put("commonHeaderKey2", "commonHeaderValue2");        //param支持中文,直接传,不要自己编码        params.put("commonParamsKey1", "commonParamsValue1");        params.put("commonParamsKey2", "这里支持中文参数");        //OkGo初始化        OkGo.init(this);        //以下设置的所有参数是全局参数,同样的参数可以在请求的时候再设置一遍,那么对于该请求来讲,请求中的参数会覆盖全局参数        //好处是全局参数统一,特定请求可以特别定制参数        try {            OkGo.getInstance()                    .debug("OkGo", Level.INFO,true)//打开该调试开关,打印级别INFO,最后的true表示是否打印okgo的内部异常,一般打开方便调试错误                    .setConnectTimeout(OkGo.DEFAULT_MILLISECONDS)//全局的连接超时时间 默认60秒                    .setWriteTimeOut(OkGo.DEFAULT_MILLISECONDS)//全局的读取超时时间                    .setReadTimeOut(OkGo.DEFAULT_MILLISECONDS)//全局的写入超时时间                    .setCacheMode(CacheMode.NO_CACHE)//全局统一设置缓存模式,默认是不使用缓存                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)//全局统一设置缓存时间,默认永不过期                    .setRetryCount(3)//全局统一设置超时重连次数,默认为三次,最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0                    .setCookieStore(new PersistentCookieStore())//cookie持久化存储,如果cookie不过期,则一直有效                    .setCertificates()//方法一:信任所有证书,不安全有风险                    .addCommonHeaders(Config.getHeaders())//设置全局公共头                    .addCommonParams(Config.getParams());//设置全局公共参数            //.setCookieStore(new MemoryCookieStore()) //cookie使用内存缓存(app退出后,cookie消失)            //.setCertificates(new SafeTrustManager()) //方法二:自定义信任规则,校验服务端证书            //.setCertificates(getAssets().open("srca.cer"))//方法三:使用预埋证书,校验服务端证书(自签名证书)            //.setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))            //方法四:使用bks证书和密码管理客户端证书(双向认证),使用预埋证书,校验服务端证书(自签名证书)            //.setHostnameVerifier(new SafeHostnameVerifier())            //配置https的域名匹配规则,详细看demo的初始化介绍,不需要就不要加入,使用不当会导致https握手失败,自定義            //可以添加全局拦截器,不需要就不要加入,错误写法直接导致任何回调不执行//          .addInterceptor(new Interceptor() {//                    @Override//                    public Response intercept(Chain chain) throws IOException {//                        return chain.proceed(chain.request());//                    }//                })        }catch (Exception e){            e.printStackTrace();        }    }}

2.OkRx使用实例

1.基本请求(post)

//获取string

 Subscription subscription = OkGo.post(Urls.URL_METHOD)                    .headers("aaa", "111")                    .params("bbb", "222")                    .getCall(StringConvert.create(), RxAdapter.<String>create())//以上为产生请求事件,请求默认发生在IO线程                    .doOnSubscribe(new Action0() {                        @Override                        public void call() {                              //开始请求前显示对话框                        }                    }).observeOn(AndroidSchedulers.mainThread())                    .subscribe(new Action1<String>() {                        @Override                        public void call(String s) {                            //請求成功                        }                    }, new Action1<Throwable>() {                        @Override                        public void call(Throwable throwable) {                            //請求失敗                        }                    });
//使用JsonCallback解析JavaBean Subscription subscription = OkGo.post(Urls.URL_JSONOBJECT)                        .headers("aaa", "111")//                        .params("bbb", "222")//一定要注意这里的写法,JsonConvert最后的大括号千万不能忘记                        .getCall(new JsonConvert<LzyResponse<ServerModel>>() {}, RxAdapter.<LzyResponse<ServerModel>>create())//                        .doOnSubscribe(new Action0() {                            @Override                            public void call() {                                //开始请求前显示对话框                            }                        })                        .map(new Func1<LzyResponse<ServerModel>, ServerModel>() {                            @Override                            public ServerModel call(LzyResponse<ServerModel> response) {                                return response.data;                            }                        })//                        .observeOn(AndroidSchedulers.mainThread())//                        .subscribe(new Action1<ServerModel>() {                            @Override                            public void call(ServerModel serverModel) {                               //请求成功                            }                        }, new Action1<Throwable>() {                            @Override                            public void call(Throwable throwable) {                                //请求失败                            }                        });
//post上传string文本Subscription subscription = OkGo.post(Urls.URL_TEXT_UPLOAD)                .headers("bbb", "222")                .upString("上传的文本。。。")//上传文本                .getCall(StringConvert.create(), RxAdapter.<String>create())//以上为产生请求事件,请求默认发生在IO线程                .doOnSubscribe(new Action0() {                    @Override                    public void call() {                        //开始请求前显示对话框                    }                }).observeOn(AndroidSchedulers.mainThread())//切换到主线程                .subscribe(new Action1<String>() {                    @Override                    public void call(String s) {                        //请求成功,关闭对话框                    }                }, new Action1<Throwable>() {                    @Override                    public void call(Throwable throwable) {                        //请求失败                    }                });
//post上传jsonSubscription subscription = OkGo.post(Urls.URL_TEXT_UPLOAD)//                .headers("bbb", "222")//                .upJson(jsonObject.toString())//post上传json                .getCall(StringConvert.create(), RxAdapter.<String>create())//以上为产生请求事件,请求默认发生在IO线程                .doOnSubscribe(new Action0() {                    @Override                    public void call() {                      //开始请求前显示对话框                      }  }).observeOn(AndroidSchedulers.mainThread())//切换到主线程                .subscribe(new Action1<String>() {                    @Override                    public void call(String s) {                       //请求成功,关闭对话框                    }                }, new Action1<Throwable>() {                    @Override                    public void call(Throwable throwable) {                       //请求失败                    }                });

2.请求图片

Subscription subscription = OkGo.post(Urls.URL_IMAGE)                .headers("aaa", "aaa")                .params("bbb",  "bbb")                .getCall(BitmapConvert.create(), RxAdapter.<Bitmap>create())                .doOnSubscribe(new Action0() {                    @Override                    public void call() {                       //                    }                })                .observeOn(AndroidSchedulers.mainThread())//                .subscribe(new Action1<Bitmap>() {                    @Override                    public void call(Bitmap bitmap) {                        //请求成功                        imageView.setImageBitmap(bitmap);                    }                }, new Action1<Throwable>() {                    @Override                    public void call(Throwable throwable) {                           //请求失败                    }                });        addSubscribe(subscription);

3.文件上传

ArrayList<File> files = new ArrayList<>();        if (imageItems != null && imageItems.size() > 0) {            for (int i = 0; i < imageItems.size(); i++) {                files.add(new File(imageItems.get(i).path));            }        }        //拼接参数        OkGo.post(Urls.URL_FORM_UPLOAD)//                .tag(this)//                .headers("header1", "headerValue1")//                .headers("header2", "headerValue2")//                .params("param1", "paramValue1")//                .params("param2", "paramValue2")////                .params("file1",new File("文件路径"))   //这种方式为一个key,对应一个文件//                .params("file2",new File("文件路径"))//                .params("file3",new File("文件路径"))                .addFileParams("file", files)           // 这种方式为同一个key,上传多个文件                .getCall(StringConvert.create(), RxAdapter.<String>create())//                .doOnSubscribe(new Action0() {                    @Override                    public void call() {                        btnFormUpload.setText("正在上传中...\n使用Rx方式做进度监听稍显麻烦,推荐使用回调方式");                    }                })                .observeOn(AndroidSchedulers.mainThread())//切换到主线程                .subscribe(new Action1<String>() {                    @Override                    public void call(String s) {                        btnFormUpload.setText("上传完成");                    }                }, new Action1<Throwable>() {                    @Override                    public void call(Throwable throwable) {                        showToast("请求失败");                    }                });

4.下载文件

OkGo.post(Urls.URL_DOWNLOAD)//                .headers("aaa", "aaa")//                .params("bbb", "bbb")//                .getCall(new FileConvert(), RxAdapter.<File>create())                .doOnSubscribe(new Action0() {                    @Override                    public void call() {                        btnFileDownload.setText("正在下载中...\n使用Rx方式做进度监听稍显麻烦,推荐使用回调方式");                    }                })//                .observeOn(AndroidSchedulers.mainThread())//                .subscribe(new Action1<File>() {                    @Override                    public void call(File file) {                        btnFileDownload.setText("下载完成");                    }                }, new Action1<Throwable>() {                    @Override                    public void call(Throwable throwable) {                        throwable.printStackTrace();                        showToast("请求失败");                    }                });
原创粉丝点击