是否可以在 Android 中使用 Retrofit2 发送 DTO 列表?

Is it possible to send DTO list using Retrofit2 in Android?

提问人:blonded 提问时间:11/13/2023 最后编辑:Brian Tompsett - 汤莱恩blonded 更新时间:11/14/2023 访问量:39

问:

我是一名使用 Kotlin 学习 Android 编程的学生。我目前正在做一个小项目。 我需要发送一个 DTO 列表,以便服务器端可以按如下方式使用它。

dataList[0].text    // data type: string
dataList[0].file    // data type: file

我找到了一种发送文件列表的方法和发送非文件数据列表的方法。但是我找不到一种方法来发送包含一组文件和非文件数据的对象列表。 如何编写改造服务定义以发送该类型对象的列表? 发送时的内容类型为 multipart/form-data。

这是我尝试和失败的方式。

@Multipart
@POST("/post")
fun addPost(
    @Part dataList: List<DataItem>  // It didn't work.
): Call<PostResponse>
Android Kotlin 改造2

评论


答:

-1赞 Moein Hossein Pour 11/13/2023 #1

要使用 Retrofit 和 发送混合了文件和非文件数据的对象列表,可以使用 和 注释。以下是修改改造服务定义的方法:multipart/form-data@Part@PartMap

假设您的类如下所示:DataItem

data class DataItem(
    val text: String,
    val file: File? // Assume file is nullable
)

改造服务定义如下:

interface ApiService {

    @Multipart
    @POST("/post")
    fun addPost(
        @Part dataList: List<MultipartBody.Part> // Use MultipartBody.Part for each item in the list
    ): Call<PostResponse>
}

现在,当您准备请求时,您需要为列表中的每个项目创建一个。您可以使用非文件数据和文件数据来实现此目的。下面是一个示例:MultipartBody.PartRequestBodyMultipartBody.Part.createFormData

val dataList: List<DataItem> = // your list of data items

val parts: List<MultipartBody.Part> = dataList.map { dataItem ->
    // For text
    val textPart = MultipartBody.Part.createFormData("text", dataItem.text)

    // For file
    val filePart = dataItem.file?.let {
        MultipartBody.Part.createFormData("file", it.name, it.asRequestBody("multipart/form-data".toMediaTypeOrNull()))
    }

    listOfNotNull(textPart, filePart)
}.flatten()

val call: Call<PostResponse> = apiService.addPost(parts)

在此示例中,对于每个 ,它为字段创建一个,为字段创建另一个字段(如果存在)。用于从列表中删除 null 值,因为文件可能为 null。DataItemMultipartBody.ParttextfilelistOfNotNull

确保应用模块中有必要的依赖项:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'

在实现此操作时,根据最新的可用版本根据需要调整版本。