Как опубликовать JSON в PHP с помощью curl

Может быть, я не в своей тарелке, но весь день я пытался запустить команду 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 Конфликт
Дата: пт, 01 мая 2009 22:03:00 по Гринвичу
Сервер: Apache/2.2.8 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Передача-кодировка: чанки
Content-Type: text/html; кодировка = изо-8859-1

{"Скринкаст":{"ID": нулевой, "субъект": нулевой, "тело": нулевой,
         "DataUrl": нулевой,"dataMedium": нулевой,"createdOn": нулевой, "автор": NULL}}

5 ответов

Решение

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

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

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

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

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

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

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

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

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

и посмотрим, поможет ли это кому-нибудь.

Вам нужно установить несколько дополнительных флагов, чтобы curl отправлял данные в формате JSON.

команда

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

флаги

  • -H: пользовательский заголовок, следующий аргумент должен быть заголовком
  • -X: пользовательский HTTP-глагол, следующий аргумент должен быть глаголом
  • -d: отправляет следующий аргумент как данные в запросе HTTP POST

Ресурсы

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

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json
Другие вопросы по тегам