提问人:blonded 提问时间:10/28/2023 最后编辑:blonded 更新时间:10/29/2023 访问量:60
我可以使用 Retrofit2 将一个列表中的文件和字符串数据发送到服务器吗?
Can I send file and string data in one list to server using Retrofit2?
问:
我是一名学习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")
}
})
我可以发送一个文件和一个字符串数据为一组的列表吗?如何修改此设置以确保服务器团队正确使用此列表?
这是我第一次写问题,所以它可能缺少很多。如果缺少任何信息,请告诉我。我会让你知道的。
答:
0赞
Zobaer Hossain
10/28/2023
#1
要使用 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
确保修改您的改造服务以接受以下列表: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
不好意思。它没有帮助。
评论