質問
私はベースから外れているかもしれませんが、午後ずっとを実行しようと試みてきましたこの凹部PHPフレームワークチュートリアルのcurl postコマンド。私が理解していないのは、PHPがPOSTをどのように解釈するかということで、常に空の配列として表示されます。
curl -i -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
(そこにあるスラッシュは、私を馬鹿に見えないようにするためのものですが、PHP 5.2を使用してWindowsから実行し、Linuxサーバー、Linux curlと同じバージョンでも試しました)
非常に簡単なように思えるので、私が見逃しているものがあるに違いありません。投稿が正しく解釈されないだけで、もしそうなら、すべてがうまくいくでしょう。
これは私が戻ってくるものです:
HTTP/1.1 409 Conflict Date: Fri, 01 May 2009 22:03:00 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1 {"screencast":{"id":null,"subject":null,"body":null, "dataUrl":null,"dataMedium":null,"createdOn":null,"author":null}}
解決
$ _ POST-arrayが読み込まれない理由のジョーダン分析は正しいです。ただし、使用できます
$data = file_get_contents("php://input");
httpボディを取得して自分で処理するだけです。 PHP入出力ストリームを参照してください。
プロトコルの観点からは、これは実際にはもっと正確です。とにかく、実際にはhttpマルチパートフォームデータを処理していないからです。また、リクエストを投稿するときに、コンテンツタイプとしてapplication / jsonを使用します。
他のヒント
通常、パラメータ -d
はフォームエンコードとして解釈されます。 -H
パラメーターが必要です:
curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
PHPは投稿されたデータがクエリ文字列形式(key = value& key1 = value1)であることを期待しているため、空の配列を取得していると思います。
curlリクエストを次のように変更してみてください:
curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
そしてそれが役立つかどうかを確認してください。
次のように引用符をエスケープする必要があります:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json