代码之家  ›  专栏  ›  技术社区  ›  Farhan Islam

如何在scalaj http中为多部分/表单数据请求添加文件作为参数?

  •  0
  • Farhan Islam  · 技术社区  · 6 年前

    我正在尝试使用scalaj http发送一个post请求,用于twitter上传。我附上了他们要求的文件。我遇到的问题是试图将实际的二进制文件作为“media”的参数传入。我似乎只看到如何执行postuti,这只是文件,然后添加参数,但实际上并没有将数据作为参数传入。

    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 回复  |  直到 6 年前
        1
  •  1
  •   Simon Groenewolt    6 年前

    我认为应该使用“media”而不是“output”作为多部分的名称,不要在params中使用“media”。

    更新: 我用charles跟踪请求,没有发现任何对我来说有问题的地方(在将“output”改为“media”之后)。下面的代码不是真正的代码修复程序,而是一种解决方法:

    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个响应,我没有进一步测试是否可以获得完整的文件上传。

    另请注意,它使用媒体数据(base64)版本,也使用“application/x-www-form-urlencoded”,而不是文档中指定的“multipart/form data”。所以根据文件它是不正确的。

        2
  •  0
  •   Simon Groenewolt    6 年前

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

    此GitHub问题链接记录了此问题的修复