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負責請求之後的處理,基於觀察者模式的響應式處理使複雜的業務邏輯在一條鏈上完成,不需要多層嵌套!