Как опубликовать 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