我可以使用 Retrofit2 将一个列表中的文件和字符串数据发送到服务器吗?

Can I send file and string data in one list to server using Retrofit2?

提问人:blonded 提问时间:10/28/2023 最后编辑:blonded 更新时间:10/29/2023 访问量:60

问:

我是一名学习Android编程的学生。我目前正在做一个制作应用程序的项目。我目前正在使用 Retrofit2 与服务器进行通信。我必须将一个文件和一个字符串数据集的列表发送到服务器。当服务器团队接收并使用此列表时,它必须能够按如下方式调用和使用:

data[0].text
data[0].file

为此,我以多种方式定义了 Retrofit 服务,包括以下代码,但未能正确发送:

// retrofit service definition

interface Service {
    @Headers("Authorization: ${BuildConfig.TOKEN}")
    @Multipart
    @POST("/post")
    fun addPost(
        @Part data: List<MultipartBody.Part>
    ): Call<PostResponse>
}
// creating a list

            val list: List<MultipartBody.Part> = viewModel.listData.value!!.map {
                MultipartBody.Part.createFormData("text", it.text)
                val image = File(it.image)
                MultipartBody.Part.createFormData(
                    "file",
                    image.name,
                    image.asRequestBody()
                )
            }
// inside api call function

            val service = AppClient.retrofit?.create(Service::class.java)
            service?.addPost(
                data = list
            )?.enqueue(object : Callback<PostResponse> {
                override fun onResponse(
                    call: Call<PostResponse>,
                    response: Response<PostResponse>
                ) {
                    if (response.isSuccessful) {

                    }
                }

                override fun onFailure(call: Call<PostResponse>, t: Throwable) {
                    Log.e("PostResponse", "API CALL FAILED $t")
                }

            })

我可以发送一个文件和一个字符串数据为一组的列表吗?如何修改此设置以确保服务器团队正确使用此列表?

这是我第一次写问题,所以它可能缺少很多。如果缺少任何信息,请告诉我。我会让你知道的。

Android Kotlin 改造2

评论


答:

0赞 Zobaer Hossain 10/28/2023 #1

要使用 Retrofit2 将每个项目都包含文件和字符串数据的列表发送到服务器,您需要创建一个自定义数据模型类来表示列表中的每个项目。我们称之为 数据模型 。此类应包含字符串和文件数据的字段。DataItemDataItem

以下是定义类的方法:DataItem

data class DataItem(
    val text: String,
    val file: MultipartBody.Part
)

现在,您可以创建对象列表并将其发送到服务器。下面是如何执行此操作的示例:DataItem

// Create a list of DataItem objects
val dataItemList = viewModel.listData.value!!.map {
    val textPart = MultipartBody.Part.createFormData("text", it.text)
    val imageFile = File(it.image)
    val filePart = MultipartBody.Part.createFormData(
        "file",
        imageFile.name,
        imageFile.asRequestBody()
    )
    DataItem(textPart, filePart)
}

// Call the API with the list of DataItem objects
val service = AppClient.retrofit?.create(TravelService::class.java)
service?.addTraveller(dataItemList)?.enqueue(object : Callback<PostResponse> {
    override fun onResponse(
        call: Call<PostResponse>,
        response: Response<PostResponse>
    ) {
        if (response.isSuccessful) {
            // Handle the successful response
        }
    }

    override fun onFailure(call: Call<PostResponse>, t: Throwable) {
        Log.e("PostResponse", "API CALL FAILED $t")
    }
})

在此代码中,您将创建一个对象列表,其中每个对象都包含一个字符串部分 () 和一个文件部分 ()。然后,将对象列表发送到服务器。DataItemtextPartfilePartDataItem

确保修改您的改造服务以接受以下列表:DataItem

interface Service {
    @Headers("Authorization: ${BuildConfig.TOKEN}")
    @Multipart
    @POST("/post")
    fun addTraveller(
        @Part data: List<DataItem>
    ): Call<PostResponse>
}

评论

1赞 DavidW 10/29/2023
这个答案看起来像是 ChatGPT 的复制粘贴
0赞 blonded 10/29/2023
此处“DataItem(textPart, filePart)”中发生类型不匹配,因为所需的类型是 String,但发现一个是 MultipartBody.Part。我应该在数据类中将字符串类型更改为 MultipartBody.Part 类型吗?
0赞 Zobaer Hossain 10/29/2023
@blonded是,请将其更改为字符串。
0赞 blonded 10/31/2023
不好意思。它没有帮助。