Retrofit 2多部分请求

3

我正在将我的现有代码迁移到 Retrofit 2,但在理解 Multipart 请求的新语法方面遇到了一些困难。我还使用 Kotlin,尽管除了一些语法变化之外,我认为这对于这个特定的问题并不重要。

这是我目前的代码:

val audioDuration = RequestBody.create(null, audioDuration.toString())
val file = RequestBody.create(MediaType.parse("audio/mp4"), 
               File(context.filesDir, filename).absoluteFile)

sendAudioChunk(audioDuration, file).enqueue(callback)

以下是API的定义:

@Multipart
@POST("path_to_request")
fun sendAudioChunk(@Part("duration") audioDuration: RequestBody,
                   @Part("audio") audioBlob: RequestBody) : Call<ResponseObject>

在Retrofit 1.9中,我使用TypedString和TypedFile作为请求参数,现在看来需要使用OkHttp的RequestBody,但我肯定错过了什么,因为请求没有正确执行。


Jake Wharton的解决方案是这样做的推荐方式; https://dev59.com/j5nga4cB1Zd3GeqPUCOm 您可以创建类型为MultipartBody.Part的@Part参数,其中包括文件名。 - Matt Wolfe
2个回答

3
我最终弄清楚了。我的Web服务需要文件上传的文件名。这似乎是新Retrofit 2中正在进行的支持工作,但可以通过将其添加到命名参数定义中来规避问题。
更多详细信息请参见:https://github.com/square/retrofit/issues/1140

如果您能展示一个解决方案的例子,那就太好了。我花了很长时间在这些帖子中搜寻正确的解决方案,而这并不是许多人所提倡的(通过转义引号将其嵌入RequestBody名称参数)。 - Matt Wolfe

1

有一点不同的是,TypedStringContent-Type 是 "text/plain; charset=UTF-8",而你并没有为 audioDuration 参数设置 Context-Type。尝试将其设置为text/plain,以获得与TypedString相同的行为(字符集将默认设置为utf-8)。

val audioDuration = RequestBody.create(MediaType.parse("text/plain"), audioDuration.toString())

如果那样不起作用,您需要提供有关“请求未正确执行”的更多信息。一个可行的请求也会很有帮助。

我已经尝试过了,但仍然不起作用。我得到了一个200的响应,但服务器认为消息长度没有内容。在之前的Retrofit版本中,内容都能够正确传递,而且我正在以相同的方式进行其他操作(或者至少我认为是这样)。如果服务器运行在应用引擎上,那可能会有所不同。 - pedronveloso
你有旧代码中可用请求的记录吗? - iagreen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接