0

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 で? どうすれば修正できますか?

4

1 に答える 1