Как разместить 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