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("请求失败"); } });
- OKRx+OkGo(okhttp-util升级版)网络请求框架使用
- okhttp-OkGo(okhttp-util升级版)网络请求框架(一)
- okhttp-OkGo(okhttp-util升级版)网络请求框架(二)
- android okGo、okHttp、XUtils网络框架使用
- 网络请求框架OkHttp改名的OkGo的介绍(以防丢失)
- okhttp网络请求框架的简单使用
- Android网络请求框架的使用okhttp
- 网络请求框架okhttp的使用
- Android网络请求框架使用 -- OkHttp
- OkHttp网络请求框架的使用
- okhttp网络请求框架
- 网络请求框架OKHttp
- OkHttp网络请求框架
- 网络请求okhttp框架
- OkHttp网络请求框架
- 网络请求 框架okhttp
- Retrofit+okhttp网络框架请求
- Android ——网络请求框架OkHttp使用
- ssh免密登录和远程文件复制
- 磁盘配额
- BWAPP:一款非常好用的漏洞演示平台
- ant使用实例
- android Google推出的31套在线课程 [记录]
- OKRx+OkGo(okhttp-util升级版)网络请求框架使用
- Java---SpringMVC注解
- 关于Git的入门操作(安装、提交代码至仓库)
- phpmyadmin登陆后出现 Array to string问题
- 参考coupon开发cardcoupon-2
- Hashtable的实现原理
- es6-函数
- 51Nod 独木舟
- C++网站开发MVC框架TreeFrog Framework教程——7.ERB模板