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

问题描述 投票:0回答:1

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

数据[0].文本 数据[0].文件

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

// retrofit service definition

interface Service {
    @Headers("Authorization: ${BuildConfig.TOKEN}")
    @Multipart
    @POST("/post")
    fun addTraveller(
        @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(TravelService::class.java)
            service?.addTraveller(
                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 api kotlin retrofit2
1个回答
0
投票

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

DataItem
。这个
DataItem
类应该包含字符串和文件数据的字段。

以下是定义

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")
    }
})

在此代码中,您创建一个

DataItem
对象列表,其中每个对象都包含字符串部分 (
textPart
) 和文件部分 (
filePart
)。然后,将
DataItem
对象列表发送到服务器。

确保修改您的 Retrofit 服务以接受

DataItem
列表:

interface Service {
    @Headers("Authorization: ${BuildConfig.TOKEN}")
    @Multipart
    @POST("/post")
    fun addTraveller(
        @Part data: List<DataItem>
    ): Call<PostResponse>
}
© www.soinside.com 2019 - 2024. All rights reserved.