Надсилайте дані POST через сирий json з листоношею


107

У мене є Postman (той, який не відкривається в Chrome), і я намагаюся зробити POST-запит, використовуючи raw json.

На вкладці "Тіло" у мене вибрано "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
)

То чому ж не працює з листоношею?


Скріншоти листоноші:

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

і заголовок:

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


Спробуйте $ _REQUEST замість $ _POST та var_dump () замість print_r ()
глибоко

@Deep Я отримую array(1) {["foo"]=> string(3) "bar"}jQuery і ще порожній масив з листоношею:array(0) {}
Даллас,

Тож листоноша не надсилає запит
глибоко

@smerny у вашій посаді fieldsі звичайний fooматч, таким чином, не буде працювати, я не впевнений, чи це помилка, але переконайтеся, що вони відповідають
meda

@meda, правда, це був помилка друку, але якби у мене були поля, він все-таки повинен мати вихід у варітному дамі $ _REQUEST або $ _POST
Даллас,

Відповіді:


38

На відміну від jQueryтого, щоб прочитати сировину, 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 vs post відрізняються від
конкретних

43

Просто перевірте JSON параметр зі спадного меню біля бінарного; коли ви натискаєте сировину. Це має робити

майстерність synon передати json листоноші


4
це досить старий пост .. але якщо ви подивитесь на питання, ви побачите, що я зробив саме це. ви можете прочитати питання, обрану відповідь та коментарі до вибраної відповіді, щоб краще зрозуміти проблему та рішення.
Даллас

1
Звичайно, але це насправді визначило проблему, яку я мав; У мене було обрано "Текст", а не application / json, хоча про це вже згадувалося в розділі заголовки. Її заплутаність; якщо ви вибрали "Текст", то відобразиться весь код "POST" HTTP POST, включаючи JSON, з яким я очікував працювати, оскільки його повний POST-дзвінок, а не лише json.
Тед

7

Відповідь meda є повністю законною, але коли я скопіював код, я отримав помилку!

Десь "php://input"там є недійсний символ (можливо, одна з лапок?).

Коли я вводив "php://input"код вручну, він працював. Зайняв мене час, щоб розібратися!


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, вона працювала. Питання: То чому б це не працювало з листоношею?
Ярослав Штрейт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.