我正试图通过多部分/表单数据请求将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对象。