gpt4 book ai didi

scala - Spray Client Post Multipart

转载 作者:行者123 更新时间:2023-12-04 15:59:08 25 4
gpt4 key购买 nike

我想使用 Spray 将多部分表单发布到服务器。特别是我想发布一个图像。

我遇到的问题是将文件编码到多部分。尽管在 Spray 中他们提到它是默认的 Marshaller,但我似乎无法将两者结合在一起。

我目前使用 Spray 1.0-M7,因为我还没有迁移到 Scala 2.10,如果示例能够与该分支兼容,那就太好了。

我目前拥有的是:

val bis = new BufferedInputStream(new FileInputStream(file))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray")
pipeline(Post("/saveImageWithSpray", bArray))

当然,我收到一条错误消息:
For request 'POST /saveImageWithSpray' [Missing boundary header]

我发现的大多数示例都使用 content(as[X]) 指令进行编码,但我没有使用 Spray-routing,我只需要在构建在另一个框架上的应用程序中使用 Spray-client 执行帖子。

谢谢

编辑

我实际上已经设法像这样编码它:
val pipeline = (
addHeader("Content-Type", "multipart/form-data")
~> sendReceive(conduit)
)
val bis = new BufferedInputStream(new FileInputStream(file, "UTF-8"))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray

Logger.error("About to post with spray "+bArray.length.toString)
pipeline(Post("/saveImageWithSpray", MultipartFormData(Map(
"spray-file" -> BodyPart(
HttpEntity(Some(HttpBody(ContentType(MediaTypes.`image/gif`), bArray))),
HttpHeaders.`Content-Disposition`("form-data", Map("name" -> "spray-file","filename"->"Fuurin (Glass Wind Chime).gif"))::Nil
)
))))

不幸的是,这仍然不起作用,数据正在传输,但服务器找不到文件。

一个wireshark捕获揭示了以下内容:
POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
User-Agent: spray-can/1.0-M7
Content-Type: multipart/form-data; boundary="oxz40rxXXQyDx+IUKcz7QYpJ"
Content-Length: 1725

--oxz40rxXXQyDx+IUKcz7QYpJ
Content-Disposition: form-data; name="spray-file"
Content-Disposition: form-data; name="spray-file"; filename="Fuurin (Glass Wind Chime).gif"
Content-Type: image/gif

GIF89a0.0..........
BINARY DATA
..P...L0..8.....X.....l..?...;
--oxz40rxXXQyDx+IUKcz7QYpJ--HTTP/1.1 500 Internal Server Error
Content-Type: text/plain; charset=utf-8
Content-Length: 25

File not found spray-file

这是使用 Advanced Rest Client 发出的有效请求的捕获:
POST /saveImageWithSpray HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Content-Length: 2573
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryuiIgwVg3rBQLFNGB
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

------WebKitFormBoundaryuiIgwVg3rBQLFNGB
Content-Disposition: form-data; name="spray-file"; filename="Gunsen (Fan) .gif"
Content-Type: image/gif

GIF89a0.0.........u.QQ..Z..z.wW[[[.
BINARY DATA
.....&...Z(.c.Q.....T.B7..S...!...p[...8."...;
------WebKitFormBoundaryuiIgwVg3rBQLFNGB--
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 24

File uploaded with spray

最佳答案

@grandes 感谢您的回复。我使用 newman rest 客户端库 ( https://github.com/stackmob/newman ) 发送 http 请求,但必须手动创建 MultipartFormData 并且它起作用了。这将在不久的将来在 newman 中修复。这是我用来手动构建多部分表单数据的链接:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

关于scala - Spray Client Post Multipart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17076100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com