Отправка данных на сервер PHP с использованием Fetch API (предпочтительнее метод POST и JSON) - PullRequest
0 голосов
/ 19 октября 2019

Я пробую Fetch API в первый раз, и у меня возникают проблемы с отправкой POST данных на сервер PHP.

Я ухожу от $.ajax и пробую чистые решения javascript для связи сразные серверы (иногда локальные, иногда нет). Теперь я пытаюсь понять Fetch API и, даже если он прост и интуитивно понятен, я наткнулся на странную и неожиданную проблему:

  • Я НЕ МОГУ отправить сообщение JSON в PHPсервер

  • Я МОГУ отправить сообщение с данными формы на ЛОКАЛЬНЫЙ PHP

  • Я НЕ МОГУ отправить сообщение с данными формы на WEB URL PHP

Я могу (очевидно) извлечь данные из всего вышеперечисленного, но странным образом ничего не приходит. Через $_SERVER['REQUEST_METHOD'] я вижу, что при использовании локального пути я получаю «POST», как я и просил, но при использовании веб-URL он меняется на GET, почему-то я не понимаю.

url="/";
url="www.something.com";
fetch(url, {
    method: 'POST',
    body: JSON.stringify({
        test: "toast",
    })
})
.then(function(response) {
    return response.text();
})
.then(function(data) {
    console.log(data);
});

Я рассчитываю только на отправку и получение данных надежным и понятным способом. Нет jquery, нет библиотек и т. Д. Я просто хочу отправить JSON {"test":"toast"} и найти его в файле PHP при проверке $_POST var.

UPDATE

Кажется, что проблемас местными и веб-URL были на эту разницу: www.something.com/test => www.something.com/test/index.php. Без index.php по какой-то причине он отказался от данных POST (но все равно читал отраженную информацию). Но проблема с JSON остается.

  • Я НЕ МОГУ отправить сообщение JSON на PHP

  • Я МОГУ отправить сообщение с данными формы на PHP

ОБНОВЛЕНИЕ

Я обнаружил, что $ _POST и $ _GET плохо работают с Fetch API. Вы должны использовать php: // input , чтобы получить все данные, отправленные на сервер.

Не знаю почему. Есть лучшее решение? Почему ajax и XMLHttpRequest не имеют подобных проблем?

Примечание. Если вы хотите, чтобы данные распознавались как json, вы должны указать их с заголовком, даже если это никогда не запрашивалось, так почему сейчас? В Fetch API чего-то не хватает?

header('Content-Type: application/json');

$test=json_decode(file_get_contents("php://input"));
//some code
echo json_encode($test);

1 Ответ

0 голосов
/ 19 октября 2019

Существует два способа использования Fetch API: один>

let response = await fetch(url,[Options]);

if (response.ok) { // if HTTP-status is 200-299
  // get the response body (the method explained below)
  let json = await response.json();
} else {
  alert("HTTP-Error: " + response.status);
}

, а второй - использование синтаксиса чистого обещания:

fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
  .then(response => response.json())
  .then(commits => alert(commits[0].author.login));

теперь позволяет говорить о параметрах и данных: ваши данные должны быть JavaScript-объектом, подобным этому:

      let data = {
        test: "toast",
      };

, тогда вы можете настроить свои заголовки следующим образом:

let headers: {
       "Content-Type": "application/json"
      }
  };

наконец использовать fetch следующим образом:

let response = await fetch(url, {
        method: "POST",
        headers:headers,
        body: JSON.stringify(data)
      });

Я думаю, что ваша проблема в использовании FormData вместо строкового объекта JavaScript

...