JSON'u PHP'ye curl ile gönderme


108

Temelden çok uzak olabilirim, ancak tüm öğleden sonra bu teneffüs PHP çerçeve eğitiminde curl post komutunu çalıştırmaya çalışıyorum . Anlamadığım şey, PHP'nin POST'umu nasıl yorumlaması gerektiği, her zaman boş bir dizi olarak karşımıza çıkıyor.

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

(Oradaki eğik çizgi beni bir aptal gibi görünmemek içindir, ancak bunu PHP 5.2 kullanarak pencerelerden çalıştırdım, ayrıca bir Linux sunucusunda denedim, Linux curl ile aynı sürüm)

Kaçırdığım bir şey olmalı çünkü oldukça basit görünüyor, gönderi doğru yorumlanmıyor, eğer öyleyse, her şey harika çalışırdı.

Geri aldığım şey bu:

HTTP / 1.1 409 Çakışması
Tarih: Cum, 01 Mayıs 2009 22:03:00 GMT
Sunucu: Apache / 2.2.8 (Win32) PHP / 5.2.6
X Destekli: PHP / 5.2.6
Transfer Kodlaması: yığın halinde
İçerik Türü: metin / html; karakter kümesi = ISO-8859-1

{ "Screencast": { "id": null, "özne": null, "beden": null,
         "DataUrl": null, "dataMedium": null, "createdon": null, "yazar": null}}

Lütfen .php dosyanızı kopyalayıp yapıştırır mısınız? Localhost: 3570 / index.php / trainingServer / screencast.json URL'sinin komut dosyanızı çalıştırdığından emin misiniz ? Bir PHP URL'si gibi görünmüyor.
pts

@pts; Peter bir tür MVC çerçevesi kullanıyor, bu URL'deki index.php'ye bir bakın.
Alan Storm

@pts PHP için Delphi (dolayısıyla: 3570) ve .htaccess dosyası olmadan Recess MVC çerçevesini kullanıyorum, dolayısıyla url'de index.php /.
Peter Turner

7
Olarak göndermeyi unutmayın application/json.
Gumbo

1
Basit olanlara eklerken çift tırnaktan kaçmak gerekli değildir.

Yanıtlar:


107

$ _POST dizisinin neden doldurulmadığına dair Jordans analizi doğrudur. Ancak kullanabilirsiniz

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

sadece http gövdesini alıp kendiniz halletmek için. Bkz PHP girdi / çıktı akımları .

Protokol perspektifinden bakıldığında, bu aslında daha doğrudur, çünkü zaten http çok parçalı form verilerini gerçekten işlemiyorsunuz. Ayrıca, isteğinizi gönderirken içerik türü olarak application / json kullanın.


7
Json_decode (file_get_contents ("php: // input"), true) çalıştı. Teşekkürler
Peter Turner

Durumuma da gerçekten yardımcı oldu! Teşekkürler Emil H!
Steve

FANTASTİK. Zend'in postayı söktüğünü düşünmesiyle çok sorun yaşıyordum .. Benim için işe yarayan basit bir çıkartma. Ayrıca Peter Turners'ın json_decode () eklenmesi bir \ stdClass nesnesi sağlar. Garmin API ping yanıtları için kullandım
JI-Web

120

Normalde parametre -d, form kodlu olarak yorumlanır. -HParametreye ihtiyacınız var :

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

18

PHP, gönderilen verilerin Querystring formatında olmasını beklediği için boş bir dizi aldığınıza inanıyorum (key = value & key1 = value1).

Curl isteğinizi şu şekilde değiştirmeyi deneyin:

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

ve bunun yardımcı olup olmadığına bakın.


Evet, -H "Content-Type: application/json"benim için işe yaramadı.
PJ Brunet

13

Curl'nin verileri JSON olarak göndermesi için fazladan birkaç bayrak ayarlamanız gerekir.

komuta

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

bayraklar

  • -H: özel başlık, sonraki bağımsız değişkenin başlık olması bekleniyor
  • -X: özel HTTP fiili, sonraki bağımsız değişkenin fiil olması bekleniyor
  • -d: sonraki bağımsız değişkeni bir HTTP POST isteğinde veri olarak gönderir

kaynaklar


1

Şu alıntılardan kaçmalısınız:

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

Windows'ta bu aslında benim için çalıştı, ancak tüm json dizesini içine almak için çift tırnak kullanmak.
etli

Pencerelerde Josef'in yukarıda önerdiği gibi çift tırnaktan kaçınmanız gerekir. O haklı.
Bobo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.