Как в php распарсить json объект без первого параметра post?

Отправляю данные с помощью строки json.

async function sender() {
        const url = "file.php";
        try {
            const response = await fetch(url, {
                method: 'POST',
                //body: ('param=' + JSON.stringify(object)),
                body: JSON.stringify(object), // {"name":"John","surname":"Smith"}
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            });
            const json = await response.text();
            console.log(json);
        } catch (error) {
            console.error('Ошибка:', error);
        }
    }

var_dump($_POST) выводит

array(1) {
  ["{"name":"John","surname":"Smith"}"]=>
  string(0) ""
}

Как вывести отдельно ключ и отдельно значение?
Чтобы дальше оперировать ими.

Пробовал так:

echo $_POST; // Array 
echo $_POST[0]; // пусто
echo $_POST[name]; // пусто
echo $_POST->name; // пусто
echo json_decode($_POST); //  json_decode() expects parameter 1 to be string, array given
echo json_encode($_POST); // Array{"{\"name\":\"John\",\"surname\":\"Smith\"}":""}




p.s. до этого отправлял с параметром, все в порядке

body: ('param=' + JSON.stringify(object)) // param={"name":"John","surname":"Smith"}

и выводил так

$param = json_decode($_REQUEST["param"]);
echo $param->name; // John

Ответы (1 шт):

Автор решения: Pavel Grishaev

Вы отправляете JSON не в значении, а в ключе, поэтому у вас $_POST как-будто ничего не содержит. Но на самом деле там ключ называется '{"name":"John","surname":"Smith"}', чего быть не должно. Возможно причина в том, что тип содержимого application/x-www-form-urlencoded, хотя в body простая строка, то есть нет названия поля коль уж это форма.

Вот пример отправки данных fetch-ем:

let formData = new FormData();
formData.append( 'param', JSON.stringify({ a:1, b:2 }) );

const response = fetch(
    'http://your-domain-example.com',
    {
        method: 'POST',
        body: formData,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    }
)

То есть если отправляете с типом application/x-www-form-urlencoded, то вам эту форму сначала создать нужно, а не просто слать сплошным.

→ Ссылка