POST リクエスト (アップロード用) を除いて、play で作成された Web サービスを検討してください。これを中サイズの画像(〜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 は header を追加することを決定しましたContent-Length: 27442
が、実際のサイズは 75211 であり、プレイ中、ボディのサイズは 27442 しかありませんでした。これは意図した動作ではありません。libwww-perlのツールcurl
を使用する代わりに、別のツールを試しました。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}
このリクエストは成功しました。そのため、ツールの違いにもっと注意を払うようになりました。まず、Content-Length
ヘッダーは正しかったのですがExpect
、2 回目の試行でヘッダーが欠落していました。どちらの方法でもリクエストが成功することを望みます。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
では、なぜ play200 OK
は次のチャンクを待たずに応答を送信するのでしょうか? curlが間違って指定しているためContent-Length
ですか?まったく間違っている場合... (おそらく、これは現在のチャンクのサイズを指しますか?)。では、問題はどこにあるのでしょうか。curl または play webapp で? どうすれば修正できますか?