1.文件上传
/**
* @param taskId
* @param file
* @return 上传文件
*/
@Multipart
@PUT("api/censor/uploadVideo")
Observable<Result> uploadFile(
@Part("taskId") long taskId,
@Part("liveId") long liveId,
@Part MultipartBody.Part file);
@MultiPart:允许包含多个@Part
@PUT:PUT请求 + 请求地址
@Part:上传参数,也可以用作MultipartBody用来指定文件,相当于使用OKhttp的MultipartBody.Part类
从源码中我们可以看出MultipartBody是继承于RequestBody的,相当于封装了一层
配置好了之后可以开始进行请求了,请求是Retrofit+rxjava结合,Retrofit负责发送请求,rxjava负责响应和处理
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("fileName", file.getName(), requestFile);
RetrofitHttp.getResponse().uploadFile(jsonDevicesResult.getData().getId(), jsonXml.getLiveId(), body)
.compose(RetrofitHttp.ThreadDispatch())
.subscribe(new Subscriber<Result>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "文件上传失败:" + e.toString());
}
@Override
public void onNext(Result result) {
Log.i(TAG, "文件上传消息: " + result.toString());
}
});
首先是创建了RequestBody的create()方法创建了一个文件上传的请求体,将请求体添加到MultipartBody.Part中,通过调用上传就完成了
2.文件下载
/**
* @param url 服务器端约定的上传路径
* @return
*/
@Streaming
@GET
Observable<ResponseBody> download(@Url String url);
@Streaming:配置注解文件上传
@GET:备注了@Streaming,GET不用携带参数哦
@Url:和服务器端约定的上传地址
RetrofitHttp.getResponse().download(url) //开始下载
.compose(RetrofitHttp.ThreadDispatch()) //下载在子线程,下载后转主线程
.map(ResponseBody::byteStream) //将responseBody转成byteStream
.observeOn(rx.schedulers.Schedulers.computation()) //事件循环
.concatMap((Func1<InputStream, rx.Observable<Long>>) inputStream -> {
//将转化出来的流写入文件中
FileUtils.writeFile(inputStream, Config.FileAssets.OUTSIDE);
return rx.Observable.timer(10, TimeUnit.SECONDS);
})
//转到主线程
.observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
//结束,获取写入结果
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "下载失败 , 失败原因:" + e.toString());
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onNext(Long aLong) {
Log.i(TAG, "下载成功");
}
});
上面的注释已经非常详细了,使用Retrofit上传和下载就是这么简单,虽然retrofit底层也是封装了OKhttp,但是封装之后使逻辑更加清楚,请求体和请求过程分离,使用注解的方式,直接通过注解就能配置各种请求,因为基于OKhttp,所以也能处理几乎所有请求,一般使用retrofit会和rxjava和OKhttp组成retrofit&rxjava&OKhttp,OKhttp负责各种配置,如请求头、拦截器、日志、响应时间等等,retrofit负责逻辑清晰,使代码更加简单易懂,rxjava负责请求之后的处理,基于观察者模式的响应式处理使复杂的业务逻辑在一条链上完成,不需要多层嵌套!