Получение переменной $_POST как пустой при правильном использовании php://input

Я создал приложение React, из которого я вызываю свой сервер, построенный на PHP.

Вот как я называю свой файл PHP:

const requestOptions = {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: JSON.stringify({ name, username, password }),
};
console.log(requestOptions);

fetch('http://localhost/crud/requests/signup.php', requestOptions)
  .then(res => res.json())
  .then(data => console.log(data));

Вот что у меня есть в файле PHP:

if (isset($_POST) && !empty($_POST)) {
  // do something
}

Когда я печатаю переменную $_POST, я получаю пустой массив. Даже $_RESPONSE пусто.

Но когда я попытался напечатать входной поток следующим образом:

print_r(file_get_contents('php://input'));

Кажется, все в порядке. Кто-нибудь может объяснить, почему это происходит? Я попытался прочитать это в документации и поискал на некоторых форумах и в блогах, но ответы меня не удовлетворили.

как указывает @JonoJames, php не поддерживает такой запрос. Вы должны декодировать запрос json из "php://input"

Giacomo M 10.04.2022 07:54
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Что нового в PHP 8.1?
Что нового в PHP 8.1?
Если вы все еще используете PHP 7, то эта статья для вас. В PHP 8, а именно в PHP 8.1, встроены некоторые очень востребованные функции, которые вам...
Разработка LMS на заказ для повышения эффективности работы и обучения
Разработка LMS на заказ для повышения эффективности работы и обучения
За последние годы в образовании произошла большая революция, и сегодня почти все учебные заведения делают упор на эксклюзивное управление учебным...
2
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны вернуть данные, как это, если вы отправляете JSON, также используйте заголовки, чтобы подтвердить правильный тип mime.

    // Get raw posted data
    $data = json_decode(file_get_contents("php://input"));   

    print_r($data);

Пример: заголовки

header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With');
header('X-Requested-With: XMLHttpRequest');
header('Accept: application/json');

Кроме того, отправка данных в виде запроса AjaxXHR означает, что принимающий PHP-файл работает аналогично API-интерфейсу отдыха, который действует отдельно от PHP-файла, отправляющего запрос. рассматривайте его как отдельное приложение, поэтому данные сеанса не передаются через систему безопасности приложения. будьте осторожны с ботами, внедряющими JSON в ваш API с запросами XHR

Ответ принят как подходящий

Встроенная поддержка форм в PHP способна анализировать только application/x-www-form-urlencoded формы и multipart/form-data формы. То, что вы на самом деле отправляете, представляет собой сериализованный объект JSON с неправильным типом MIME application/x-www-form-urlencoded.

Чтобы на самом деле отправить форму application/x-www-form-urlencoded, используйте URLSearchParams вместо JSON.stringify:

fetch('http://localhost/crud/requests/signup.php', {
  method: 'POST',
  body: new URLSearchParams({ name, username, password }),
})
.then(res => res.json())
.then(data => console.log(data));

В этом случае нет необходимости явно устанавливать Content-Type: браузер сделает это автоматически. Чтобы отправить полезную нагрузку multipart/form-data (что вам может понадобиться, если вы хотите загружать файлы большего размера), вместо этого используйте объект FormData.

Если вы все-таки хотите отправить JSON, вы должны отправить его с правильным типом MIME в заголовке, application/json. Что касается PHP, вам придется анализировать полезную нагрузку вручную, используя json_decode.

Единственная проблема, с которой я столкнулся бы с этим решением, заключается в том, что сначала параметры URL-адреса отображаются в URL-адресе, поэтому безопасные данные, такие как пароли, видны в URL-адресе, а во-вторых, если он отходит от реагирования и использует метод в веб-браузере, поддержка отсутствует для URLsearchPareams в Internet Explorer

JonoJames 10.04.2022 16:12

@JonoJames Нет, это не так. Это тело запроса POST, а не параметры запроса GET. URLSearchParams это просто имя.

user3840170 10.04.2022 16:15

Другие вопросы по теме