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

108

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

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

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

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

Вот что я получаю:

HTTP / 1.1 409 конфликт
Дата: пт, 01 мая 2009 г., 22:03:00 GMT
Сервер: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Передача-кодирование: фрагментированное
Тип содержимого: текст / html; кодировка = изо-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}
Питер Тернер
источник
Не могли бы вы скопировать и вставить свой файл .php? Вы уверены, что URL-адрес localhost: 3570 / index.php / trainingServer / screencast.json запускает ваш скрипт? Это не похоже на URL-адрес PHP.
птс
@pts; Питер использует какую-то структуру MVC, взгляните на index.php в этом URL.
Алан Сторм,
@pts Я использую Delphi для PHP (отсюда: 3570) и инфраструктуру Recess MVC без файла .htaccess, следовательно, index.php / в URL-адресе.
Питер Тернер
7
Не забудьте отправить его как application/json.
Гамбо,
1
При встраивании их в простые кавычки нет необходимости избегать двойных кавычек.

Ответы:

107

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

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

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

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

Эмиль Х
источник
7
Выполнение json_decode (file_get_contents ("php: // input"), true) сработало. Спасибо
Питер Тернер
Действительно помогло и в моей ситуации! Спасибо, Эмиль Х!
Стив,
ФАНТАСТИКА. У меня были большие проблемы с Zend, думая, что он удаляет сообщение ... Простое извлечение, которое сработало для меня. Также Питер Тернерс добавил json_decode (), предоставляющий объект \ stdClass. Я использовал его для ответов на пинг Garmin API
JI-Web
120

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

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Джим Кэрриг
источник
18

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

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

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

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

Джордан С. Джонс
источник
Да, у -H "Content-Type: application/json"меня не сработало.
PJ Brunet
13

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

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

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

источник
В Windows это действительно сработало для меня, но я использовал двойные кавычки, чтобы заключить всю строку json.
meatvest
в окнах вы должны избегать двойных кавычек, как предложил Йозеф выше. Он прав.
Бобо,