Как опубликовать JSON в PHP с помощью curl
Вопрос
Может быть, я и далек от истины, но я весь день пытался бежать команда curl post ( скручивание ) в этом уроке мы рассмотрим фреймворк PHP.Чего я не понимаю, так это того, как PHP должен интерпретировать мой ПОСТ, он всегда отображается в виде пустого массива.
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}}
Решение
Анализ Джордана о том, почему массив $ _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).
Попробуйте изменить запрос 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-глагол, ожидается, что следующим аргументом будет verb-d
:отправляет следующий аргумент в виде данных в HTTP POST запросе
Ресурсы
Вы должны избегать кавычек, как это:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json