curlを使用してJSONをPHPに投稿する方法


108

私はかなりベースから外れているかもしれませんが、私は午後中ずっとこの休憩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から実行しました。Linuxcurlと同じバージョンのLinuxサーバーでも試してみました)

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

これは私が返すものです:

HTTP / 1.1 409の競合
日付:2009年5月1日(金)22:03:00 GMT
サーバー:Apache / 2.2.8(Win32)PHP / 5.2.6
X-Powered-By:PHP / 5.2.6
Transfer-Encoding:チャンク
Content-Type:text / html; charset = iso-8859-1

{"スクリーンキャスト":{"id":null、 "subject":null、 "body":null、
         "dataUrl":null、 "dataMedium":null、 "createdOn":null、 "author":null}}

.phpファイルもコピーして貼り付けてもらえますか?URL localhost:3570 / index.php / trainingServer / screencast.jsonがスクリプトを実行してもよろしいですか?PHPのURLのようには見えません。
PTS

@pts; Peterは何らかのMVCフレームワークを使用しています。そのURLのindex.phpを見てください。
アランストーム

@pts私はDelphi for PHP(したがって:3570)と.htaccessファイルのないRecess MVCフレームワークを使用しているため、URLにindex.php /を使用しています。
ピーターターナー

7
として送信することを忘れないでくださいapplication/json
ガンボ

1
単純なものに埋め込むときに二重引用符をエスケープする必要はありません。

回答:


107

$ _POST-arrayにデータが入力されない理由のジョーダン分析は正しいです。ただし、使用できます

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

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

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


7
json_decode(file_get_contents( "php:// input")、true)を実行するとうまくいきました。ありがとう
ピーターターナー

私の状況も本当に助けてくれました!Emil Hに感謝します。
スティーブ

幻想的。Zendが投稿をはがしていると思って、私は多くの問題を抱えていました。また、Peter Turnersがjst_decode()を追加して、\ stdClassオブジェクトを提供します。Garmin API ping応答に使用しました
JI-Web

120

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

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

18

PHPはポストされたデータがQuerystring形式(key = value&key1 = value1)であると想定しているため、空の配列を取得していると思います。

curlリクエストを次のように変更してみてください:

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

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


はい、-H "Content-Type: application/json"私にとってはうまくいきませんでした。
PJ Brunet

13

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

コマンド

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

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

資源


1

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

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

Windowsではこれが実際に機能しましたが、json文字列全体を二重引用符で囲みました。
ミートベスト2012年

Windowsでは、Josefが上記で提案したように、二重引用符をエスケープする必要があります。彼は正しい。
ボボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.