Як додати JSON до PHP з завитком


108

Я можу бути далеко від бази, але я увесь день намагався запустити команду post curl у цьому посібнику фрейму 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 GMT
Сервер: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Передача-кодування: відрізка
Тип вмісту: текст / html; charset = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}

Чи можете ви скопіювати і вставити файл .php? Ви впевнені, що URL-адреса localhost: 3570 / index.php / trainingServer / screencast.json запускає ваш сценарій? Це не схоже на URL-адресу PHP.
пт

@pts; Пітер використовує якусь структуру MVC, погляньте на index.php у цій URL-адресі.
Алан Шторм

@pts Я використовую Delphi для PHP (звідси: 3570) та рамку Recess MVC без виводу .htaccess-файлу, отже, index.php / в URL-адресі.
Пітер Тернер

7
Не забудьте надіслати його як application/json.
Gumbo

1
Не потрібно уникати подвійних лапок при вбудовуванні їх у прості.

Відповіді:


107

Аналіз Йордана, чому масив $ _POST не заповнений, є правильним. Однак ви можете використовувати

$data = file_get_contents("php://input");

просто отримати тел http і обробити його самостійно. Див . Потоки вводу / виводу PHP .

З точки зору протоколу це насправді правильніше, оскільки ви насправді не обробляєте дані багаточастинної форми http. Також використовуйте application / json як тип вмісту, коли публікуєте запит.


7
Робота json_decode (file_get_contents ("php: // input"), true) працювала. Спасибі
Пітер Тернер

Дійсно допоміг і моїй ситуації! Дякую Еміль Н!
Стів

FANTASTIC. У мене було багато проблем із Зендом, думаючи, що він знімає посаду. Просте видобуток, яке працювало на мене. Також додав Пітер Тернерс json_decode (), що забезпечує об’єкт \ stdClass. Я використовував це для відповідей від Garmin API ping
JI-Web

120

Зазвичай параметр -dінтерпретується як закодований формою. Вам потрібен -Hпараметр:

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json

18

Я вважаю, що ви отримуєте порожній масив, оскільки PHP очікує, що опубліковані дані будуть у форматі Querystring (key = value & key1 = value1).

Спробуйте змінити запит на завиток на:

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

і подивіться, чи це допомагає.


Так, у -H "Content-Type: application/json"мене не вийшло.
PJ Brunet

13

Вам потрібно встановити кілька додаткових прапорів, щоб curl надсилав дані як JSON.

командування

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

прапори

  • -H: спеціальний заголовок, очікується, що наступний аргумент буде заголовком
  • -X: користувацьке дієслово HTTP, наступним аргументом очікується дієслово
  • -d: надсилає наступний аргумент як дані в HTTP POST-запиті

ресурси


1

Вам слід уникати цитат:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

У Windows це насправді працювало для мене, але використовуючи подвійні лапки, щоб укласти весь рядок json.
mesvest

у вікнах ви повинні уникати подвійних цитат, як Йозеф запропонував вище. Він правий.
Бобо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.