Вопрос

Может быть, я и далек от истины, но я весь день пытался бежать команда 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top