考虑使用Play编写的Web服务,除了POST请求(用于上传)。现在,当用medium size image (~75K)进行测试时,我发现了一个奇怪的行为。好吧,代码比长篇解释说得更清楚,所以:
$ curl -vX POST localhost:9000/path/to/upload/API -H "Content-Type: image/jpeg" -d @/path/to/mascot.jpg
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9000 (#0)
> POST /path/to/upload/API HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:9000
> Accept: */*
> Content-Type: image/jpeg
> Content-Length: 27442
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Content-Length: 16
<
* Connection #0 to host localhost left intact
{"success":true}
正如你所看到的,curl决定添加标题Content-Length: 27442
,但它不是真的,真正的大小是75211,并且在游戏中,我确实有一个体积只有27442.粗,这是不是预期的行为。所以我尝试了一个不同的工具,而不是curl
我使用了 libwww-perl 中的POST
工具:
cat /path/to/mascot.jpg | POST -uUsSeE -c image/jpeg http://localhost:9000/path/to/upload/API
POST http://localhost:9000/path/to/upload/API
User-Agent: lwp-request/6.03 libwww-perl/6.05
Content-Length: 75211
Content-Type: image/jpeg
200 OK
Content-Length: 16
Content-Type: application/json; charset=utf-8
Client-Date: Mon, 16 Jun 2014 09:21:00 GMT
Client-Peer: 127.0.0.1:9000
Client-Response-Num: 1
{"success":true}
此请求成功。所以我开始更加关注工具之间的差异。对于starter:Content-Length
标头是正确的,但是,第二次尝试时缺少Expect
标头。我希望请求以任何一种方式成功。所以在游戏中看到的标题的完整列表(通过request.headers
)是:
卷曲:
ArrayBuffer((Content-Length,ArrayBuffer(27442)),
(Accept,ArrayBuffer(*/*)),
(Content-Type,ArrayBuffer(image/jpeg)),
(Expect,ArrayBuffer(100-continue)),
(User-Agent,ArrayBuffer(curl/7.35.0)),
(Host,ArrayBuffer(localhost:9000)))
用于libwww-perl POST:
ArrayBuffer((TE,ArrayBuffer(deflate,gzip;q=0.3)),
(Connection,ArrayBuffer(TE, close)),
(Content-Length,ArrayBuffer(75211)),
(Content-Type,ArrayBuffer(image/jpeg)),
(User-Agent,ArrayBuffer(lwp-request/6.03 libwww-perl/6.05)),
(Host,ArrayBuffer(localhost:9000)))
所以我目前的想法是:更简单的perl工具使用单个请求,这是不好的做法。更好的方法是等待100 continue
确认(特别是如果你要上传几GB的数据......)。 curl
将继续发送数据,直到收到200 OK
或一些错误请求错误代码为止。那么为什么播放发送200 OK
响应而不等待下一个块?是因为curl指定了错误的Content-Length
?如果它完全错了...(也许这指的是当前块的大小?)。
那么问题出在哪里?在卷曲或播放webapp?以及如何修复它?
答案 0 :(得分:2)
问题出在我的curl命令中。当我应该使用-d
参数时,我使用了--data
参数,这是--data-ascii
或--data-binary
的简称。