3

私は Sinatra で小さなサーバー バックエンドを書き直しています。現在、クライアントはecho "foo" | curl -X PUT -T - http://localhost:8090/. 問題は、putSinatra の私のメソッドでは、request.body.read呼び出した後でも常に空でrewindあることです。さらに、paramsハッシュは完全に空です。

奇妙なのは、curl -X PUT -d 'foo' http://localhost:8090/代わりにそれを行うとうまくいくということです。request.on('data')また、node.js では、関数と関数を使用して問題なく読み取ることができますrequest.on('end')

PUTシナトラで体を読む方法はありますか? 可能であれば、クライアント コードの変更は避けたいと考えています。

4

1 に答える 1

10

-Tクライアントからのcurlコマンドがフラグ を誤用していると思います。-Tデータを送信するのではなく、ファイルをアップロードするためのものです。通常、宛先ファイル名を指定しない場合-T、アップロードにはローカル ファイル名が使用されます。たとえばcurl -X PUT -T "bar.txt" http://localhost:8090/、ローカル ファイルbar.txtをリモート ロケーションにアップロードしますhttp://localhost:8090/bar.txt。クライアント コードはファイルを指定する代わりに stdin をパイプするため、ローカル ファイル名は存在しません。また、クライアント コードでは宛先ファイル名が指定されていないため、未定義の結果が生成されます。node.js がファイルのアップロードの内容をリクエスト本文のデータとして受け入れることは、非標準的な動作だと思います。

フラグを使用した 2 番目の例-dは、データを送信する適切な方法です。クライアントコードを変更することが最善の解決策だと本当に思いますが、必要に応じて stdin をパイプすることもできます。-dの代わりに次の-Tように使用します。

echo "foo" | curl -X PUT -d @- http://localhost:8090/
于 2012-08-27T08:10:16.920 に答える