我正在使用 Kotlin 学习 Android 编程。我目前正在使用 Retrofit2 与服务器进行通信。需要传递到服务器端的数据之一是包含一组文本和一张图片的列表。当我发送它时,内容类型是“multipart/form-data”。
如果用数据类来表示的话,如下。
data class DataItem(
val text: String,
val image: File
)
我要发送的是这个数据类对象的列表。 如果我把我想做的事情表达为Retrofit服务定义的意思的话,如下。
@Multipart
@POST("/post")
fun addPost(
@Part dataList: List<DataItem> // But it didn't work
): Call<PostResponse>
我尝试通过以下方式更改数据类,但也没有成功。
data class DataItem(
val text: RequestBody,
val image: MultipartBody.Part
)
当服务器团队收到并使用这个列表时,必须能够调用并使用如下:
dataList[0].text
dataList[0].image
我找到了这些方法。
但是我找不到一种方法来发送包含非文件数据和文件数据的数据类对象列表。 如何定义一个 Retrofit 服务来按照我所说的方式发送服务器端可用的列表?
要将列表作为 RequestBody 发送,您必须先将其转换为 json 字符串,然后再将其包装到 RequestBody 中(使用扩展函数 toRequestBody())。
这是一个示例:
@Multipart
@Headers("Accept: application/json")
@POST("/post")
fun addPost(
@Part dataList: RequestBody,
@Part file: MultipartBody.Part,
): Call<PostResponse>
还有邮寄电话。我使用 Gson 将模型(列表)转换为 Json 字符串:
fun addPostCall(
dataList: List<DataItem>,
image: File,
) {
myServiceClient.addPost(
dataList = Gson()
.toJson(dataList)
.toRequestBody(),
file = MultipartBody.Part.createFormData(
"file",
image.name,
image.asRequestBody((image
.toURI()
.toURL()
.openConnection().contentType ?: image.extension
.takeIf { extension -> extension.isNotEmpty() }
?.let { extension ->
MimeTypeMap
.getSingleton()
.getMimeTypeFromExtension(extension)
})?.toMediaTypeOrNull()
),
)
)
}