播放错误请求中的WS-post多部分/表单数据



我正试图通过多部分/表单数据请求将pdf文件发布到外部服务。我已经使用示例JavaScript客户端完成了这项工作,因此外部服务可以正常工作。在scala中悬停,我得到以下代码:错误请求:

import akka.stream.scaladsl.FileIO
import akka.stream.scaladsl.Source
import play.api.libs.ws.WSClient
import play.api.mvc.MultipartFormData._
val pathToFile = "./sampleCV.pdf"
val fileName = "sampleCV.pdf"
val futureResponse = ws.url(url).withRequestTimeout(Duration.create(55, TimeUnit.SECONDS))
.addHttpHeaders("authorization" -> s"bearer $access_token")
.addHttpHeaders("accept" -> "*/*")
.addHttpHeaders("content-type" -> "multipart/form-data")
.post(Source(
FilePart("File", fileName, Option("application/pdf"), FileIO.fromPath(Paths.get(pathToFile)))  :: List()
))

播放版本:2.6.19

以下curl命令正确上传文件:

curl -X POST "https://rest_url" -H "accept: */*" -H "Authorization: bearer <TOKEN>" -H "Content-Type: multipart/form-data" -F "File=@sampleCV.pdf;type=application/pdf"

我是否遗漏了post(...)中的一些重要参数?ScalaWS中与此CURL请求相对应的适当发布参数是什么?

当使用多部分/表单数据时,需要一个边界参数。内容类型标题看起来像这样:

Content-Type: multipart/form-data; boundary=nZaYg9TFHoDaLWhs8w

您使用addHttpHeaders设置了"内容类型"标头,但由于它缺少边界参数,因此不起作用。解决方案是不手动设置该标头,事实上,您永远不需要设置该标头。Play WS将根据传递给post方法的对象类型添加适当的Content-Type标头。当您传递Source[Part[Source[ByteString, Any]]]时,它将设置多部分/表单数据内容类型,并添加适当的边界参数。

我遇到了同样的问题,添加了在mycase中解决的Content-Length标头。在WSRequest、中添加了如下标题

wsRequest.setHeader("Content-Length", String.valueOf(fileToUpload.length()));

这里的fileToUpload是您试图上传的java.io.File对象。

最新更新