如何在scalaj-http中为multipart / form-data请求添加文件作为参数?

时间:2018-07-13 18:37:58

标签: scala http twitter

我正在尝试使用scalaj-http发送POST请求以进行Twitter上传。香港专业教育学院附上他们要求的文档。我遇到的问题是尝试将实际的二进制文件作为“媒体”的参数传递。我似乎只能看到如何执行postMulti,它只是文件,然后添加参数,但实际上没有将数据作为参数传递。

val appendResponse = Http(twitterApiUrl)
  .postMulti(MultiPart("media", "Output.bin", "application/mac-binary", byteArray))
  .postForm(Seq("command" -> "APPEND", "media_id" -> twitterMediaID, "segment_index" -> "0"))
  .oauth(consumer = consumer, token = access)
  .asString

https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-append

2 个答案:

答案 0 :(得分:1)

我认为您应该使用“ media”而不是“ Output”作为MultiPart的名称,并且不要在参数中使用“ media”。

更新:我使用Charles跟踪了请求,但没有发现任何对我来说不对的东西(将“输出”更改为“媒体”之后)。下面的代码并不是真正的代码修复,而是更多解决方法:

val appendResponse = Http("https://upload.twitter.com/1.1/media/upload.json")
    .postForm
    .params(
        Seq(
            "command" -> "APPEND",
            "media_id" -> twitterMediaID,
            "segment_index" -> "0",
            "media_data" -> Base64.getEncoder.encodeToString(byteArray)
        )
    )
    .oauth(consumer, token)
    .asString

这给了我204回应,我没有进一步测试是否可以上传完整的文件。

还请注意,这使用的是media_data(base64)版本,并且使用的是“ application / x-www-form-urlencoded”,而不是文档中指定的“ multipart / form-data”。因此,根据文档,这是不正确的。

答案 1 :(得分:0)

https://github.com/scalaj/scalaj-http/issues/170

此问题的修补程序记录在此github问题链接上