版本:2.3.5
作者:西门提督
日期:2016-12-13
##技术包含:Rxjava+Retrofit2+Okhttp3+FastJson 框架支持:
普通GET请求
普通POST请求
Token失效自动刷新,续发接口
嵌套请求(比如第二个接口需要第一个接口的参数)
数组集合循环
定时操作
周期性操作
轮询请求
多异步请求并发,不按顺序返回接受
多异步请求并发,顺序返回接受
多异步请求并发,等待所有异步完成再做操作
普通上传文件
上传文件显示进度
多文件上传显示进度
普通下载
下载文件显示进度
##Http请求框架用法如下:
###1.AndroidManifest.xml添加权限:
// 访问网络权限
uses-permission android:name="android.permission.INTERNET"
// 往sdcard中写入数据的权限
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
// 在sdcard中创建/删除文件的权限
uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
###2.Application初始化操作 @Override public void onCreate(){super.onCreate(); HttpManager.Opration.setBaseUrl("http://www.cmonbaby.com/"); // 请求路径前缀,可参考Retrofit2 HttpManager.Opration.setShowLoger(true); // 是否打印网络请求详情,可参考Okhttp3 }
###普通GET请求: public void testGet(){Subscription s = HttpHelper.Builder .builder(service.getVersion(getVersionParamas())) .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e(" >>> ", "before(new Action0)")} }) .loadable(this) // 可不填,请求Dialog实现 .filter(new Action1<BaseBean>(){// 非必需实现 @Override public void call(BaseBean o){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 if (!o.isSuccess()) Log.e(" >>> ", o.isSuccess() + "")} }) .callback(new HttpCallback<BaseBean>(){@Override public void onSuccess(BaseBean o){Log.e(" >>> ", o.getData().getChangeLog())} }) .toSubscribe(); addSubscription(s)}
###普通POST请求: public void testPost(){Subscription s = HttpHelper.Builder .builder(service.versionAction(getVersionParamas())) .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e(" >>> ", "before(new Action0)")} }) .loadable(this) // 可不填,请求Dialog实现 .filter(new Action1<BaseBean>(){// 非必需实现 @Override public void call(BaseBean o){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 if (!o.isSuccess()) Log.e(" >>> ", o.isSuccess() + "")} }) .callback(new HttpCallback<BaseBean>(){@Override public void onSuccess(BaseBean o){Log.e(" >>> ", o.getData().getChangeLog())} }) .toSubscribe(); addSubscription(s)}
###当某些请求需要携带Token,而Token失效自动刷新再续发原请求: public void testToken(){Subscription s = TokenHelper.Builder .builder(service.loginReward(mToken, testUrl1), service.login(testUrl2, "simon@cmonbaby.com", "123456")) .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e(" before >>> ", "before(new Action0)")} }) .loadable(this) // 可不填,请求Dialog实现 .retryCount(3) // 非必需重写,默认3次请求失败重试 .tokenFilter(new TokenAction<BaseHttpEntity, BaseHttpEntity>(){@Override public Observable<BaseHttpEntity> call(BaseHttpEntity token){// token自动刷新后,得到token再返回续发请求接口 mToken = token.getData().getXauthToken(); Log.e("token >>> ", mToken); return service.loginReward(mToken, testUrl1)} }) .actionFilter(new Action1<BaseHttpEntity>(){// 非必需实现 @Override public void call(BaseHttpEntity info){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 if (!info.isSuccess()) Log.e("actionFilter >>> ", info.getErr())} }) .callback(new HttpCallback<BaseHttpEntity>(){@Override public void onSuccess(BaseHttpEntity info){// 最终请求返回数据 Log.e("callback >>> ", info.getData().toString())} }) .toSubscribe(); addSubscription(s)}
###嵌套请求(比如第二个接口需要第一个接口的参数) public void nesting(){Subscription s = NestingHelper.Builder .builder(service.login(testUrl2, "simon@cmonbaby.com", "123456"), service.loginReward(mToken, testUrl1)) .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e(" >>> ", "before(new Action0)")} }) .loadable(this) // 可不填,请求Dialog实现 .nestingCall(new NestingFunction<BaseHttpEntity, BaseHttpEntity>(){@Override public Observable<BaseHttpEntity> call(BaseHttpEntity token){Log.e("token >>> ", token.getData().getXauthToken()); // 得到第一个接口数据返回 mToken = token.getData().getXauthToken(); // 请求第二个接口 return service.loginReward(mToken, testUrl1)} }) .toFilter(new Action1<BaseHttpEntity>(){// 非必需实现 @Override public void call(BaseHttpEntity info){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 if (!info.isSuccess()) Log.e("toFilter >>> ", info.getErr())} }) .callback(new HttpCallback<BaseHttpEntity>(){@Override public void onSuccess(BaseHttpEntity info){// 第二个接口数据返回 Log.e("callback >>> ", info.getData().toString())} }) .toSubscribe(); addSubscription(s)}
###数组、集合的遍历 public void list(){String[] names ={"张三", "李四", "王五", "赵六", "钱七"}; Observable .from(names) .subscribe(new Action1(){
@Override public void call(String name){Log.e("list >>> ", name)} })} ###定时操作 public void timer(){Observable.timer(2, TimeUnit.SECONDS) .subscribe(new Observer(){
@Override public void onCompleted(){Log.e ("timer >>> ", "completed")} @Override public void onError(Throwable e){Log.e("timer >>> ", "error")} @Override public void onNext(Long number){Log.e ("timer >>> ", "hello world")} })} ###周期性操作 public void cycle(){Observable.interval(2, TimeUnit.SECONDS) .subscribe(new Observer(){
@Override public void onCompleted(){Log.e ("cycle >>> ", "completed")} @Override public void onError(Throwable e){Log.e("cycle >>> ", "error")} @Override public void onNext(Long number){Log.e ("cycle >>> ", "hello world")} })} ###轮询请求 public void polling(){Observable.create(new Observable.OnSubscribe<BaseBean>(){@Override public void call(final Subscriber<? super BaseBean> observer){Schedulers.newThread().createWorker() .schedulePeriodically(new Action0(){@Override public void call(){Log.e("polling >>> ", "polling")} }, 3000, 5000, TimeUnit.MILLISECONDS)} // 首次执行行动之前等待, 执行动作之间等待的时间间隔 }).subscribe(new HttpCallback<BaseBean>(){@Override public void onSuccess(BaseBean bean){Log.e("polling >>> ", bean.getData().getChangeLog())} })}
###多异步请求并发,不按顺序返回接受 public void merge(){// 拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者 Subscription s = Merge2Helper.Builder.builder(service.versionAction(getVersionParamas()), service.login(testUrl2, "simon@cmonbaby.com", "123456")) .loadable(this) // 可不填,请求Dialog实现 .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "before")} }) .result1(new Action1<BaseBean>(){@Override public void call(BaseBean version){// 第一个接口返回 Log.e("result1 >>> ", version.getData().getChangeLog())} }) .result2(new Action1<BaseHttpEntity>(){@Override public void call(BaseHttpEntity token){// 第二个接口返回 Log.e("result2 >>> ", token.getData().getXauthToken())} }) .toSubscribe(); addSubscription(s)}
public void concat(){Subscription s = Concat2Helper.Builder.builder(service.versionAction(getVersionParamas()), service.login(testUrl2, "li_ai@baxter.com", "123456")) .loadable(this) // 可不填,请求Dialog实现 .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "before")} }) .result1(new Action1<BaseBean<VersionEntity>>(){@Override public void call(BaseBean<VersionEntity> version){// 第一个接口返回 Log.e("result1 >>> ", version.getData().getChangeLog())} }) .result2(new Action1<BaseHttpEntity<TokenEntity>>(){@Override public void call(BaseHttpEntity<TokenEntity> token){// 第二个接口返回 Log.e("result2 >>> ", token.getData().getXauthToken())} }) .toSubscribe(); addSubscription(s)} ###多异步请求并发,等待所有异步完成再做操作 public void zip(){Subscription s = Zip2Helper.Builder.builder(service.versionAction(getVersionParamas()), service.login(testUrl2, "simon@cmonbaby.com", "123456"), String.class) .loadable(this) // 可不填,请求Dialog实现 .before(new Action0(){// 非必需实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "before")} }) .result1(new Action1<BaseBean>(){@Override public void call(BaseBean version){// 第一个接口返回 Log.e("result1 >>> ", version.getData().getChangeLog())} }) .result2(new Action1<BaseHttpEntity>(){@Override public void call(BaseHttpEntity token){// 第二个接口返回 Log.e("result2 >>> ", token.getData().getXauthToken())} }) .result(new Func2<BaseBean, BaseHttpEntity, String>(){@Override public String call(BaseBean version, BaseHttpEntity token){// 得到第一个,第二个接口返回后,执行第三个接口 Log.e("result >>> ", version.getData().getChangeLog() + "\n" + token.getData().getXauthToken()); return version.getData().getChangeLog() + "\n" + token.getData().getXauthToken()} }) .callback(new HttpCallback(){@Override public void onSuccess(String s){// 第三个接口数据返回 Log.e("callback >>> ", s)} }) .toSubscribe(); addSubscription(s)}
###普通上传文件 public void testUpload(){String url = "http://www.cmonbaby.com/image"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); File file = new File(path + "/" + "simon.jpg"); RequestBody body = RequestBody.create(MediaType.parse("image/jpeg"), file); MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body); service.uploadFile(url, getVersionParamas(), part) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new HttpCallback<BaseBean>(){@Override public void onSuccess(BaseBean version){// 上传完成 Log.e("simon >>> ", version.getData().getName())} })}
###上传文件显示进度 public void testUploadProgress(){final String url = "http://www.cmonbaby.com/image"; Subscription s = UploadFile.Builder.upload(VersionService.class, service.uploadFile(null, null, null)) .loadable(this) // 可不填,请求Dialog实现 .dialogTitle("图片上传") // 可不填 .dialogContent("正在上传……") // 可不填 .fileType("image/jpeg") // 可不填 .fileParams("file") // 可不填 .filePath(Environment.getExternalStorageDirectory().getAbsolutePath() + "/testUpload.jpg") // 测试路径 .requestService(new UploadFileCall<BaseBean, VersionService>(){@Override public Observable<BaseBean> uploadFile(VersionService service, MultipartBody.Part part){return service.uploadFile(url, getVersionParamas(), part)} }) .before(new Action0(){// 可不实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "init something")} }) .progressListener(new ProgressListener(){// 上传进度监听 @Override public void onProgress(long progress, long total, boolean isFinish){// 可不实现 Log.e("progress >>> ", progress + " / " + total + " --- " + isFinish)} }) .filter(new Action1<BaseBean>(){// 可不实现 @Override public void call(BaseBean version){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 Log.e("filter >>> ", version.getData().getName())} }) .callback(new HttpCallback<BaseBean>(){@Override public void onSuccess(BaseBean version){// 上传完成 Log.e("callback >>> ", version.getData().getName())} }) .toSubscribe(); addSubscription(s)}
###多文件上传显示进度 public void testUploadFiles(){final String url = "http://www.cmonbaby.com/images"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); Subscription s = UploadFiles.Builder.uploadFiles(VersionService.class, service.uploadFiles(null, null, null)) .loadable(this) // 可不填,请求Dialog实现 .dialogTitle("图片上传") // 可不填 .dialogContent("正在上传……") // 可不填 .fileParams("files") // 可不填 .files(new File(path + "/" + "simon.jpg")) // 测试路径1 .files(new File(path + "/" + "testUpload.jpg")) // 测试路径2 .files(new File(path + "/" + "temp.jpg")) // 测试路径3 .requestService(new UploadFilesCall<BaseListBean, VersionService>(){@Override public Observable<BaseListBean> uploadFiles(VersionService service, Map<String, RequestBody> requestBodyMap){return service.uploadFiles(url, requestBodyMap, getVersionParamas())} }) .before(new Action0(){// 可不实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "init something")} }) .progressListener(new ProgressListener(){// 上传进度监听 @Override public void onProgress(long progress, long total, boolean isFinish){// 可不实现 Log.e("progress >>> ", progress + " / " + total + " --- " + isFinish)} }) .filter(new Action1<BaseListBean>(){// 可不实现 @Override public void call(BaseListBean version){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 Log.e("filter >>> ", version.getData().size() + "")} }) .callback(new HttpCallback<BaseListBean>(){@Override public void onSuccess(BaseListBean version){// 上传完成 Log.e("callback >>> ", version.getData().size() + "")} }) .toSubscribe(); addSubscription(s)}
###普通下载 public void testDown(){String url = "http://www.cmonbaby.com/download/http-2.3.5.apk"; service.downloadFile(url) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new HttpCallback<Response>(){@Override public void onSuccess(Response response){// 下载完成,流的写入代码此处省略 Log.e("simon >>> ", response.body().toString())} })}
###下载文件显示进度 public void testDownProgress(){final String url = "http://www.cmonbaby.com/download/http-2.3.5.apk"; Subscription s = DownloadFile.Builder.download(VersionService.class) .loadable(this) // 可不填,请求Dialog实现 .dialogTitle("文件下载") // 可不填 .dialogContent("文件下载中,请稍候……") // 可不填 .responseService(new DownLoadCall(){@Override public Observable<Response> downloadFile(VersionService service){return service.downloadFile(url)} }) .before(new Action0(){// 可不实现 @Override public void call(){// 请求之前做一些事情,周期只有一次 Log.e("before >>> ", "init something")} }) .progressListener(new ProgressListener(){// 下载进度监听 @Override public void onProgress(long progress, long total, boolean isFinish){Log.e("progress >>> ", progress + " / " + total + " --- " + isFinish)} }) .filter(new Action1<Response>(){// 可不实现 @Override public void call(Response response){// 数据过滤,比如服务端返回200,但业务出现错误可在此进行处理 Log.e("filter >>> ", response.body().toString())} }) .callback(new HttpCallback<Response>(){@Override public void onSuccess(Response response){// 下载完成,流的写入代码此处省略 Log.e("callback >>> ", response.body().toString())} }) .toSubscribe(); addSubscription(s)}