Отправить данные POST через необработанный json с почтальоном

107

У меня есть почтальон (тот, который не открывается в Chrome), и я пытаюсь выполнить запрос POST, используя необработанный json.

На вкладке Body я выбрал "raw" и "JSON (application / json)" с этим телом:

{
    "foo": "bar"
}

Для заголовка у меня 1, Content-Type: application/json

На стороне PHP я print_r($_POST);пока что просто делаю и получаю пустой массив.


Если я использую jQuery и делаю:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Я получаю, как и ожидалось:

Array
(
    [foo] => bar
)

Так почему он не работает с Postman?


Скриншоты почтальона:

введите описание изображения здесь

и заголовок:

введите описание изображения здесь

Даллас
источник
Попробуйте $ _REQUEST вместо $ _POST и var_dump () вместо print_r ()
Deep
@Deep Я получаю array(1) {["foo"]=> string(3) "bar"}с jQuery и все еще пустой массив с Postman:array(0) {}
Даллас,
Итак, Почтальон не отправляет запрос
Deep
@smerny в вашем сообщении fieldsи не fooбудет совпадать, поэтому он не сработает, я не уверен, что это опечатка, но убедитесь, что они совпадают
meda
@meda, верно, это была опечатка, но если бы у меня были поля, он все равно должен был бы выводиться в дампе var $ _REQUEST или $ _POST
Даллас

Ответы:

38

В отличие от jQueryтого, чтобы читать raw, JSONвам нужно будет декодировать его в PHP.

print_r(json_decode(file_get_contents("php://input"), true));

php://input - это поток только для чтения, который позволяет читать необработанные данные из тела запроса.

$_POSTэто переменные формы, вам нужно будет переключиться на formрадиокнопку, а postmanзатем использовать:

foo=bar&foo2=bar2

Чтобы опубликовать сырье jsonс помощью jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});
Меда
источник
да, переменные постов json и post разные
meda
43

Просто выберите вариант JSON в раскрывающемся списке рядом с двоичным кодом; когда вы нажимаете raw. Это должно сделать

умение synon передать json почтальону

Итачи
источник
4
это довольно старый пост ... но если вы посмотрите на вопрос, то увидите, что я сделал именно это. вы можете прочитать вопрос, выбранный ответ и комментарии к выбранному ответу, чтобы лучше понять проблему и решение.
Даллас
1
Конечно, но это на самом деле выявило мою проблему; У меня был выбран «Текст», а не application / json, хотя это уже упоминалось в разделе «Заголовки». Это сбивает с толку; если вы выберете «Текст», то отобразится весь «код» HTTP POST, включая JSON, который, как я ожидал, будет работать, поскольку это полный вызов POST, а не только json.
Тед
7

Ответ meda полностью законен, но когда я скопировал код, я получил ошибку!

Где-то "php://input"там недопустимый символ (может быть, одна из кавычек?).

Когда я набирал "php://input"код вручную, он работал. Мне потребовалось время, чтобы понять!

CoredusK
источник
1
Рад, что прокрутил немного дальше и увидел это - у меня была та же проблема. Хорошая находка!
Чарли Стэнард
2
Похоже, кто-то исправил это при редактировании сообщения meda. Но я просмотрел историю редактирования и обнаружил, что в исходном сообщении 200c 200b(символы нулевой ширины) между «n» и «p» во «input». Не знаю, как он к этому пришел, но теперь это исправлено.
Даллас,
6

Я столкнулся с той же проблемой, у меня работал следующий код:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);

Нео
источник
1

Установите собственное приложение Postman, расширение Chrome устарело. (Моя открывалась в собственном окне, но все еще работала как приложение Chrome)

Ярослав Штрейт
источник
2
Это не отвечает на вопрос.
jhpratt
@jhpratt на самом деле это так. У меня была такая же проблема. При использовании приложения Postman все работало. Вопрос: так почему он не работает с Postman?
Ярослав Штрейт 02