【问题标题】:Retrofit 2 Multipart requests改造 2 多部分请求
【发布时间】:2015-10-07 00:57:58
【问题描述】:

我正在将现有代码库迁移到 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,但由于请求无法正确执行,我必须遗漏一些东西。

【问题讨论】:

标签: android retrofit kotlin


【解决方案1】:

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

更多细节在这里:https://github.com/square/retrofit/issues/1140

【讨论】:

  • 如果您只是在此处展示了一个示例,那就太好了。这花了我一段时间来搜索这些线程以找到许多人不提倡的正确解决方案(通过转义引号将其嵌入到 RequestBody 名称参数中)
【解决方案2】:

有一点不同的是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 但服务器认为消息长度没有内容。在以前的改造版本中,内容还不错,我正在以同样的方式做其他所有事情(或者至少我是这么认为的)。服务器正在应用引擎上运行,如果这有影响的话。
  • 您有旧代码的工作请求的副本吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多