Как опубликовать JSON в PHP с помощью curl - PullRequest
107 голосов
/ 02 мая 2009

Возможно, я далеко от базы, но я весь день пытался запустить команду curl post в этом учебном пособии по фреймворку PHP. Я не понимаю, как PHP должен интерпретировать мой POST, он всегда выглядит как пустой массив.

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

(косая черта там только для того, чтобы я не выглядела как идиот, но я выполнил это из windows, используя PHP 5.2, также пробовал на сервере Linux, та же версия с Linux curl)

Там должно быть что-то, чего я упускаю, потому что это кажется довольно простым, пост просто не будет правильно истолкован, если бы это было так, все бы отлично работало.

Вот что я получаю обратно:

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}}

Ответы [ 5 ]

121 голосов
/ 03 декабря 2009

Обычно параметр -d интерпретируется как закодированный в форме. Вам нужен параметр -H:

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
105 голосов
/ 02 мая 2009

Иорданский анализ того, почему массив $ _POST не заполнен, верен. Тем не менее, вы можете использовать

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

, чтобы просто получить тело http и обработать его самостоятельно. См. Потоки ввода / вывода PHP .

С точки зрения протокола это на самом деле более правильно, так как вы все равно не обрабатываете данные многочастных форм http Кроме того, используйте application / json в качестве типа содержимого при публикации запроса.

18 голосов
/ 02 мая 2009

Я полагаю, что вы получаете пустой массив, потому что PHP ожидает, что опубликованные данные будут в формате строки запроса (ключ = значение & ключ1 = значение1).

Попробуйте изменить свой запрос curl на:

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

и посмотрите, поможет ли это.

12 голосов
/ 27 декабря 2012

Вам нужно установить несколько дополнительных флагов, чтобы 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 голос
/ 16 августа 2009

Вы должны избегать кавычек, как это:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...