kotlin 如何在Android中使用Retrofit2发送DTO列表?

58wvjzkj  于 6个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(88)

我正在使用Kotlin学习Android编程。我目前正在使用Retrofit 2与服务器进行通信。需要传递到服务器端的数据之一是一组文本和一张图片的列表。当我发送时,内容类型为'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


我找到了这些方法。
1.只发送一个非文件数据。
1.发送多个非文件数据。(PartMap)
1.只发送一个文件数据。
1.发送多个文件数据。(列表<MultipartBody.Part>)
但是我找不到一种方法来发送包含非文件数据和文件数据的数据类对象的列表。我如何定义一个Retrofit服务来发送服务器端可用的列表?

axkjgtzd

axkjgtzd1#

要将列表作为RequestBody发送,必须先将其转换为json字符串,然后再将其 Package 为RequestBody(使用扩展函数toRequestBody())。
下面是一个例子:

@Multipart
@Headers("Accept: application/json")
@POST("/post")
fun addPost(
    @Part dataList: RequestBody,
    @Part file: MultipartBody.Part,
): Call<PostResponse>

字符串
还有post调用。我使用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()
            ),
        )
    )
}

相关问题