我是一名学习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")
}
})
可以发送一个文件和一个字符串数据为一组的列表吗?我如何修改它以确保服务器团队正确使用此列表?
第一次写问题,可能还有很多不足。如果缺少任何信息,请告诉我。我会让你知道的。
要使用 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>
}