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

播放WS-post来自scala的多部分/表单数据-错误请求,scala,playframework,multipartform-data,Scala,Playframework,Multipartform Data,我正试图通过多部分/表单数据请求将pdf文件发布到外部服务。我已经使用示例Java脚本客户端完成了这项工作,因此外部服务可以正常工作。scala中的Howewer,代码如下:请求错误: import akka.stream.scaladsl.FileIO import akka.stream.scaladsl.Source import play.api.libs.ws.WSClient import play.api.mvc.MultipartFormData._ val pathToFil

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

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”接受:*/*“-H”授权:承载“-H”内容类型:多部分/表格数据“-F”文件=@sampleCV.pdf;类型=应用程序/pdf”


我是否错过了
post(…)
中的一些重要参数?ScalaWS中与此CURL请求相对应的适当post参数是什么?

使用多部分/表单数据时,需要边界参数。内容类型标题将如下所示:

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

我遇到了同样的问题,添加内容长度头在mycase中得到了解决。在WSRequest中添加了如下标题

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

这里fileToUpload是您尝试上载的java.io.File对象。

首先检查您的请求,例如使用cURLI编辑的问题和添加的示例curl POST,该服务适用。谢谢标题
接受
不同,同时文件字段
文件
!=
cv
并检查令牌(作为Scala值应该命名为
accessToken
)完成-结果相同-请求错误