Js fetch post работает, но php пуст

У меня есть этот метод выборки

loginbutton.onclick = (e)=> {
    e.preventDefault();
    var creds = {
        login: login.value,
        pass: pass.value
    }
    
    fetch('functions/asklogin.php', {
        method: "POST",
        header: {"Content-type": "application/json; charset=UTF-8"},
        body: JSON.stringify(creds)
    })
    .then(resp => resp.text())
    .then(data => console.info(data));
}

Когда я нажимаю, мое тело xhr сыто:

Но если я попытаюсь повторить эти параметры из моего asklogin.php

echo "no".$_POST['pass'].":".$_POST['login'];

Все, что я получаю, это no:

спасибо за помощь

Какой результат, когда вы var_dump($_POST)?

Urmat Zhenaliev 14.12.2020 15:15

Это должно вам помочь - stackoverflow.com/q/8893574/4287624

HymnZzy 14.12.2020 15:18

@UrmatZhenaliev пустой массив

Richard 14.12.2020 15:19

@Richard .. Короче говоря, для работы $_POST вам нужно отправить данные в виде данных формы вместе с соответствующим типом контента. Если вы отправляете данные json, вам нужно использовать php://input для чтения опубликованных данных.

HymnZzy 14.12.2020 15:24

Извините, ребята, я должен был упомянуть, что я знаю, что поток является лентой (но я думал, что это было явно, так как я разместил его скриншот). В любом случае, спасибо @HymnZzy, да, но как вы передаете данные в виде классической формы в API-интерфейсе? Я не могу найти правильный синтаксис в документе API

Richard 14.12.2020 15:29
body: Object.entries(creds).map(([k,v])=>{return k+'='+v}).join('&') и установите тип контента как application/x-www-form-urlencoded
HymnZzy 14.12.2020 15:38

Вы можете сделать, как сказал HymnZzy, но, вероятно, проще (и менее хрупко) просто изменить способ чтения данных PHP.

ADyson 14.12.2020 15:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
7
7 356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

$_POST в PHP распознает только данные формы (application/x-www-form-urlencoded или multipart/form-data) с указанным заголовком типа контента.

Для любого другого типа контента вам нужно будет использовать php://input для чтения и анализа данных.

В вашем случае изменение данных, которые вы отправляете через fetch, должно решить проблему.

...
fetch('functions/asklogin.php', {
    method: "POST",
    headers: {"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"},
    body: Object.entries(creds).map(([k,v])=>{return k+'='+v}).join('&') // in jQuery simply use $.param(creds) instead
})
...

Альтернативным решением будет изменение способа чтения данных на стороне PHP.

...
if ( is_empty($_POST) ){ $_POST = json_decode(file_get_contents('php://input'), true) }
...

Хорошо, адаптация на стороне php работает. Не метод выборки, кажется, что-то не хватает в строке? в любом случае, спасибо!

Richard 14.12.2020 17:39

Это должно быть: $_POST = json_decode(file_get_contents('php://input'), true)

Jaap Broeders 19.12.2022 13:02

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