Jak wysłać JSON do PHP za pomocą curl


108

Być może jestem daleko od podstaw, ale przez całe popołudnie próbowałem uruchomić polecenie curl post w tym samouczku dotyczącym frameworka PHP. Nie rozumiem tylko, w jaki sposób PHP ma interpretować mój POST, zawsze pojawia się jako pusta tablica.

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

(Ukośnik ma tylko sprawić, że nie będę wyglądać jak idiota, ale wykonałem to z systemu Windows przy użyciu PHP 5.2, również wypróbowałem na serwerze Linux, ta sama wersja z curl Linuksa)

Musi być coś, czego mi brakuje, ponieważ wydaje się to całkiem proste, po prostu post nie zostałby zinterpretowany poprawnie, gdyby tak było, wszystko byłoby świetnie.

Oto, co otrzymuję:

Konflikt HTTP / 1.1 409
Data: piątek, 1 maja 2009, 22:03:00 czasu GMT
Serwer: 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}}

Czy mógłbyś skopiować i wkleić również swój plik .php? Czy jesteś pewien, że adres URL localhost: 3570 / index.php / trainingServer / screencast.json uruchamia Twój skrypt? Nie wygląda jak adres URL PHP.
pkt

@pts; Peter używa pewnego rodzaju frameworka MVC, spójrz na index.php w tym adresie URL.
Alan Storm

@pts Używam Delphi dla PHP (stąd: 3570) i ​​frameworka Recess MVC bez pliku .htaccess, stąd index.php / w adresie URL.
Peter Turner

7
Nie zapomnij wysłać go jako application/json.
Gumbo

1
Umieszczając je w prostych cudzysłowach, nie trzeba unikać podwójnych cudzysłowów.

Odpowiedzi:


107

Analiza Jordans dotycząca przyczyny niewypełnienia tablicy $ _POST jest poprawna. Możesz jednak użyć

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

po prostu pobrać treść http i obsłużyć ją samodzielnie. Zobacz strumienie wejścia / wyjścia PHP .

Z punktu widzenia protokołu jest to bardziej poprawne, ponieważ tak naprawdę nie przetwarzasz danych formularza wieloczęściowego http. Podczas wysyłania żądania użyj także application / json jako typu zawartości.


7
Wykonywanie kodu json_decode (file_get_contents ("php: // input"), true) działało. Dzięki
Peter Turner

Naprawdę pomogło również w mojej sytuacji! Dzięki Emil H!
Steve

FANTASTYCZNY. Miałem wiele problemów z Zendem, który myślał, że rozbiera słupek… Prosta ekstrakcja, która mi się przydała. Również Peter Turners dodał json_decode () dostarczając obiekt \ stdClass. Użyłem go do odpowiedzi pingów Garmin API
JI-Web

120

Zwykle parametr -djest interpretowany jako zakodowany w postaci. Potrzebujesz -Hparametru:

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

18

Uważam, że otrzymujesz pustą tablicę, ponieważ PHP oczekuje, że opublikowane dane będą w formacie Querystring (klucz = wartość i klucz1 = wartość1).

Spróbuj zmienić swoją prośbę o zawinięcie na:

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

i zobacz, czy to pomoże.


Tak, u -H "Content-Type: application/json"mnie nie działa.
PJ Brunet

13

Musisz ustawić kilka dodatkowych flag, aby curl wysyłał dane jako JSON.

Komenda

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

flagi

  • -H: niestandardowy nagłówek, następny argument powinien być nagłówkiem
  • -X: niestandardowy czasownik HTTP, następny argument powinien być czasownikiem
  • -d: wysyła następny argument jako dane w żądaniu HTTP POST

zasoby


1

Powinieneś uciec przed cytatami w ten sposób:

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

W systemie Windows to faktycznie działało dla mnie, ale używając podwójnych cudzysłowów, aby ująć cały ciąg json.
Meatvest

w oknach musisz unikać podwójnych cudzysłowów, jak zasugerował Josef powyżej. On ma rację.
Bobo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.