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需要新增。
相關文章
- struct的一種用法Struct
- Retrofit與LiveData結合LiveData
- 函式組合的 N 種模式函式模式
- OkHttp、rxJava、Retrofit聯合網路請求(一)HTTPRxJava
- HotSpot的7種垃圾收集器組合HotSpot
- 組合數取模的幾種方法--Exlucas&楊輝三角&組合
- 【力扣】組合總數(另一種整數溢位)力扣
- 一張圖看懂 SQL 的各種 join 用法SQL
- 組合模式-統一的處理個別物件與組合物件模式物件
- 熬夜講解vue3組合API中setup、 ref、reactive的用法VueAPIReact
- 23種設計模式之組合模式設計模式
- RecyclerView 結合cardview和materia degisn通過retrofit的一個專案,山寨it之家View
- 【Google設計衝刺】一種適合於創新小組的協作方式Go
- 使用聯合索引的一種情況索引
- OkHttp、rxJava、Retrofit聯合網路請求(二)HTTPRxJava
- reduce() 多種用法
- Guava Preconditions類的各種用法Guava
- 關於JObject的用法,以及實現動態生成實體物件、動態建立一些Josn組合Object物件
- Python中paramiko 模組的用法Python
- Python中operator 模組的用法Python
- Python中pathlib 模組的用法Python
- Python中itertools 模組的用法Python
- flutter sliver 多種滾動組合開發指南Flutter
- java23種設計模式——八、組合模式Java設計模式
- 自動生成介面各種逆向組合引數
- 深入剖析Retrofit系列(一)來自官方的Retrofit開發手冊(中英互譯)
- 集合的組合
- 安川機器人示教器按鍵10種組合用法的說明機器人
- 陣列分組chunk的一種寫法陣列
- python幾種裝飾器的用法Python
- 資料庫Delete的多種用法資料庫delete
- sys_connect_by_path的兩種用法
- 【力扣】組合總和3(組合的去重)力扣
- 8種最坑的SQL錯誤用法,第一個就很坑?SQL
- nodejs request模組用法NodeJS
- Retrofit2原始碼解析(一)原始碼
- Retrofit原始碼分析一 概覽原始碼
- mysql的組合索引MySql索引