web-dev-qa-db-ja.com

curlでJSONをPHPに投稿する方法

私はベースから外れているかもしれませんが、私は午後中ずっと curl postコマンド このリセスPHPフレームワークチュートリアルで実行しようと試みてきました。私が理解していないのは、どのようにPHPが私のPOSTを解釈することになっているのか、それは常に空の配列として現れるということです。

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(そこにあるスラッシュは、私を馬鹿のように見せないためだけのものですが、PHP 5.2を使用してWindowsからこれを実行し、Linux curl、同じバージョンのLinuxサーバーでも試しました)

それはかなり簡単なように見えるので、私が見逃しているものがあるに違いありません。投稿が正しく解釈されないだけで、もしそうなら、すべてがうまくいくでしょう。

これは私が得るものです:

 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}} 
108
Peter Turner

ヨルダンの$ _POST-arrayが設定されていない理由の分析は正しいです。ただし、使用できます

$data = file_get_contents("php://input");

http本体を取得して自分で処理するだけです。 PHP入出力ストリーム を参照してください。

プロトコルの観点からは、これは実際にはより正確です。とにかくhttpマルチパートフォームデータを実際に処理しているわけではないからです。また、リクエストを送信するときに、コンテンツタイプとしてapplication/jsonを使用します。

105
Emil H

通常、パラメータ-dは、フォームエンコードとして解釈されます。 -Hパラメーターが必要です。

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
121
Jim Carrig

PHPは、投稿されたデータがクエリ文字列形式(key = value&key1 = value1)であることを期待しているため、空の配列を取得していると思います。

カールリクエストを次のように変更してみてください。

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

それが役立つかどうかを確認します。

18
Jordan S. Jones

CurlがデータをJSONとして送信するように、いくつかの追加フラグを設定する必要があります。

コマンド

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

  • -H:カスタムヘッダー、次の引数はヘッダーであることが期待されています
  • -X:カスタムHTTP動詞、次の引数は動詞であることが期待されています
  • -d:次の引数をHTTP POSTリクエストのデータとして送信します

資源

13
Chris Knadler

次のように引用符をエスケープする必要があります。

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json
1
Josef Richter