Retrofit @Multipart@PartMap@Part組合的一種用法
1、應用場景
有這樣一個需求:要實現附件與字串引數同時提交請求。
附件可能是多個,字串引數也可能是多個。
2、實現
2.1、api的宣告寫法
只實現多檔案上傳,處理方式如下:
@Multipart
@POST("api/uploadFile")
fun uploadFiles(
@Part parts: List<MultipartBody.Part>
): Call<ResponseBody>
實現多檔案上傳及多字串引數組合形式,處理方式如下:
@Multipart
@POST("api/uploadRecord")
fun uploadRecord(
@PartMap inspectionBean: Map<String, @JvmSuppressWildcards RequestBody>,
@Part imgs: List<MultipartBody.Part>,
@Part videos: List<MultipartBody.Part>
): Call<ResponseBody>
2.2、實際呼叫
實現多檔案上傳及多字串引數組合形式,實際呼叫如下:
//selectedImageFilePaths 組裝檔案物件列表
private var selectedImageFilePaths: ArrayList<File> = ArrayList()
private var selectedVideoFilePaths: ArrayList<File> = ArrayList()
val map = HashMap<String, RequestBody>()
map["id"] = toRequestBody(bean!!.id)
map["content"] = toRequestBody(bean!!.content)
val result :ResponseBody = uploadRecord(
map,
filesToMultipartBodyParts("imgs", selectedImageFilePaths)!!,
filesToMultipartBodyParts("videos", selectedVideoFilePaths)!!,
deleteFiles
)
//輸出
val jsonStr = String(result.bytes())
println(jsonStr)
toRequestBody子函式:
private fun toRequestBody(value: String): RequestBody {
return RequestBody.create(MediaType.parse("text/plain"), value)
}
filesToMultipartBodyParts子函式(將File轉成MultipartBody.Part):
private fun filesToMultipartBodyParts(
name: String,
files: List<File>
): List<MultipartBody.Part>? {
if (files == null) {
return null
}
val parts: MutableList<MultipartBody.Part> =
ArrayList(files.size)
for (file in files) {
val requestBody = RequestBody.create(MediaType.parse("*/*"), file)
val part =
MultipartBody.Part.createFormData(name, file.name, requestBody)
parts.add(part)
}
return parts
}
在api宣告處我們需要的引數是RequestBody型別的,所以需要將字串轉成RequestBody型別,子函式作用也在於此。
3、總結
關鍵字:
@PartMap:
不支援直接與@FormUrlEncoded同時使用,所以需要單獨注意字串編碼問題,主要是採用@PartMap是採用"binary"方式進行傳輸的。
支援多個ResponseBody方式傳輸。
@Part:單個ResponseBody方式傳輸。
RequestBody:存放請求資訊的物件,如header等資訊
MultipartBody.Part:多檔案上傳時要求的格式,繼承RequestBody這個類。
@JvmSuppressWildcards:用來註解類和方法,使得被標記元素的泛型引數不會被編譯成萬用字元,kotlin需要新增。
相關文章
- 記錄的一些Retrofit的小用法
- struct的一種用法Struct
- 函式組合的 N 種模式函式模式
- 舉例說明在組合語言中,"[]"的用法組合語言
- 組合數取模的幾種方法--Exlucas&楊輝三角&組合
- OkHttp、rxJava、Retrofit聯合網路請求(一)HTTPRxJava
- HotSpot的7種垃圾收集器組合HotSpot
- 初探RxJava以及結合Retrofit的使用RxJava
- 【力扣】組合總數(另一種整數溢位)力扣
- Retrofit與LiveData結合LiveData
- 組合模式-統一的處理個別物件與組合物件模式物件
- RxJava 與 Retrofit 結合的最佳實踐RxJava
- 23種設計模式之組合模式設計模式
- dev treelist和searchcontrol組合模糊查詢用法dev
- 一張圖看懂 SQL 的各種 join 用法SQL
- 熬夜講解vue3組合API中setup、 ref、reactive的用法VueAPIReact
- 【Google設計衝刺】一種適合於創新小組的協作方式Go
- 記錄一種自定義標籤的用法
- 自動生成介面各種逆向組合引數
- java23種設計模式——八、組合模式Java設計模式
- 【力扣】組合總和3(組合的去重)力扣
- RecyclerView 結合cardview和materia degisn通過retrofit的一個專案,山寨it之家View
- 一本組合學習題集——《組合問題與練習》
- 組合
- Retrofit原始碼解讀(一)--Retrofit簡單流程原始碼
- 關於JObject的用法,以及實現動態生成實體物件、動態建立一些Josn組合Object物件
- mysql的組合索引MySql索引
- IT組合和專案組合管理(轉)
- 【數學】組合數學 - 排列組合
- flutter sliver 多種滾動組合開發指南Flutter
- 請教關於spring 兩種組合載入方式的使用?Spring
- 陣列分組chunk的一種寫法陣列
- Iterator模式的幾種用法模式
- 從itpub看來的一道組合題
- 分享一個RAID+LVC的組合AI
- 樹形結構的處理——組合模式(一)模式
- OkHttp、rxJava、Retrofit聯合網路請求(二)HTTPRxJava
- 機器學習之特徵組合:組合獨熱向量機器學習特徵