Как разместить JSON на PHP с завитой
Я могу быть вне базы, но я пробовал весь день, чтобы запустить команду 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)
Должно быть, что-то мне не хватает, потому что это кажется довольно простым, сообщение просто не интерпретируется правильно, если бы оно было, все было бы отлично.
Вот что я возвращаю:
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}}
Ответы
Ответ 1
Анализ Jordans, почему массив $_POST не заполнен, является правильным. Однако вы можете использовать
$data = file_get_contents("php://input");
чтобы просто восстановить тело http и обработать его самостоятельно. Смотрите PHP-входные/выходные потоки.
С точки зрения протокола это на самом деле более правильно, так как вы все равно не обрабатываете данные мультиплексора http. Кроме того, при отправке запроса используйте приложение /json в качестве типа содержимого.
Ответ 2
Обычно параметр -d
интерпретируется как закодированный формами. Вам нужен параметр -H
:
curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
Ответ 3
Я считаю, что вы получаете пустой массив, потому что PHP ожидает, что опубликованные данные будут в формате Querystring (key = value & key1 = value1).
Попробуйте изменить запрос на завивание:
curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json
и посмотрите, поможет ли это любому.
Ответ 4
Вам нужно установить несколько дополнительных флагов, чтобы curl отправил данные как JSON.
Команда
$ curl -H "Content-Type: application/json" \
-X POST \
-d '{"JSON": "HERE"}' \
http://localhost:3000/api/url
флаги
-
-H
: пользовательский заголовок, ожидается, что следующий аргумент будет заголовком
-
-X
: пользовательский HTTP-глагол, следующий аргумент должен быть глаголом
-
-d
: отправляет следующий аргумент как данные в запросе HTTP POST
Ресурсы
Ответ 5
Вам следует избегать кавычек следующим образом:
curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json