改造2个多部分请求

时间:2015-10-07 00:57:58

标签: android retrofit kotlin

我正在将现有代码库迁移到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>

On Retrofit 1.9我使用TypedString和TypedFile作为请求参数,现在似乎需要使用OkHttp的RequestBody,但由于请求没有正确执行,我必须遗漏一些东西。

2 个答案:

答案 0 :(得分:3)

我最终弄明白了。我的网络服务需要一个文件上传文件名。这似乎是新Retrofit 2中的一项正在进行的工作支持,但可以通过将其添加到命名参数定义来解决问题。

此处有更多详情:https://github.com/square/retrofit/issues/1140

答案 1 :(得分:1)

有一点不同的是,TypedString会有Content-Type的“text / plain; charset = UTF-8”,你根本就没有设置Context-Type您的audioDuration参数。尝试将其设置为text/plain以获得与TypedString相同的行为(默认情况下,charset将设置为utf-8)。

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

如果这不起作用,您需要提供有关“请求无法正确执行”的更多信息。您尝试复制的工作请求也会有所帮助。