Cara memposting JSON ke PHP dengan curl

108

Saya mungkin jauh dari dasar, tapi saya sudah mencoba sepanjang sore untuk menjalankan perintah curl post dalam tutorial kerangka PHP reses ini. Apa yang saya tidak mengerti adalah bagaimana PHP seharusnya menafsirkan POST saya, itu selalu muncul sebagai array kosong.

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

(Garis miring di sana hanya untuk membuat saya tidak terlihat seperti orang bodoh, tetapi saya mengeksekusi ini dari windows menggunakan PHP 5.2, juga mencoba di server Linux, versi yang sama dengan Linux curl)

Pasti ada sesuatu yang saya lewatkan karena tampaknya cukup mudah, postingan tidak diartikan dengan benar, jika ya, semuanya akan berfungsi dengan baik.

Inilah yang saya dapatkan kembali:

Konflik HTTP / 1.1 409
Tanggal: Jum, 01 Mei 2009 22:03:00 GMT
Server: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Transfer-Encoding: dipotong
Jenis Konten: teks / html; charset = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createOn": null, "author": null}}
Peter Turner
sumber
Bisakah Anda juga menyalin-tempel file .php Anda? Apakah Anda yakin bahwa URL localhost: 3570 / index.php / trainingServer / screencast.json menjalankan skrip Anda? Ini tidak terlihat seperti URL PHP.
poin
@p; Peter menggunakan semacam kerangka kerja MVC, lihat index.php di URL itu.
Alan Storm
@pts Saya menggunakan Delphi untuk PHP (karenanya: 3570) dan kerangka MVC Recess tanpa file .htaccess, maka index.php / di url.
Peter Turner
7
Jangan lupa kirim sebagai application/json.
Gumbo
1
Tidak perlu menghindari tanda kutip ganda saat menyematkannya menjadi tanda kutip sederhana.

Jawaban:

107

Analisis Jordans mengapa array $ _POST tidak diisi sudah benar. Namun, Anda bisa menggunakan

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

untuk hanya mengambil isi http dan menanganinya sendiri. Lihat aliran input / output PHP .

Dari perspektif protokol, ini sebenarnya lebih tepat, karena Anda tidak benar-benar memproses data formulir multipart http. Selain itu, gunakan application / json sebagai tipe konten saat memposting permintaan Anda.

Emil H.
sumber
7
Melakukan json_decode (file_get_contents ("php: // input"), true) berhasil. Terima kasih
Peter Turner
Sangat membantu situasi saya juga! Terima kasih Emil H!
Steve
FANTASTIS. Saya mengalami banyak masalah dengan Zend mengira itu melucuti pos .. Ekstraksi sederhana yang berhasil untuk saya. Juga penambahan json_decode () oleh Peter Turners yang menyediakan objek \ stdClass. Saya menggunakannya untuk respons ping API Garmin
JI-Web
120

Biasanya parameter -ddiinterpretasikan sebagai form-encoded. Anda membutuhkan -Hparameter:

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

Saya yakin Anda mendapatkan array kosong karena PHP mengharapkan data yang diposting dalam format Querystring (key = value & key1 = value1).

Coba ubah permintaan curl Anda menjadi:

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

dan lihat apakah itu membantu.

Jordan S. Jones
sumber
Ya, -H "Content-Type: application/json"itu tidak berhasil untuk saya.
PJ Brunet
13

Anda perlu menyetel beberapa tanda tambahan agar curl mengirimkan data sebagai JSON.

perintah

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

bendera

  • -H: header kustom, argumen berikutnya diharapkan menjadi header
  • -X: kata kerja HTTP khusus, argumen berikutnya diharapkan menjadi kata kerja
  • -d: mengirimkan argumen berikutnya sebagai data dalam permintaan HTTP POST

sumber daya

Chris Knadler
sumber
1

Anda harus menghindari kutipan seperti ini:

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

sumber
Di Windows, ini benar-benar berfungsi untuk saya, tetapi menggunakan tanda kutip ganda untuk menyertakan seluruh string json.
meatvest
di jendela Anda harus menghindari tanda kutip ganda seperti yang disarankan Josef di atas. Dia benar.
Bobo