Javascript получить полезную нагрузку API не доставлено - PullRequest
0 голосов
/ 09 марта 2020
console.log("data ", data); // returns an object in JSON format {propertyName: propertyValue}
dataString = JSON.stringify(dataString); //correctly stringified json

let response = await fetch('updateRecevingEntry.php', 
                {
                method:'POST',
                headers: {'Content-Type':'application/json'}, 
                body: dataString
            }).then(response=>response.json()); 

однако я получаю неопределенный индекс на стороне php.

, где php:

$matkey = $_POST['materialKey'];

возвращает

<b>Notice</b>:  Undefined index: materialKey in <b>path/updateRecevingEntry.php</b> on line <b>3</b><br />

для всех данных ... ни один из них не перехватывается.

так почему _POST ['propertyName'] не перехватывает stringData из тела?

Я пробовал несколько вариантов, например отправка данных вместо строковых данных, связанных с заголовком, но я не могу понять, как отправить полезную нагрузку так, чтобы _POST ['propertyName'] ловило данные в теле.

Раньше я использовал $. ajax из jquery, и это работало: но я сейчас нахожусь в процессе рефакторинга.

API Fetch - новый для меня. где я иду не так Я также не хочу анализировать объект json на стороне php.

после прочтения одного из ответов, я заставил его работать в одном случае, но

        let response = await fetch('updateRecevingEntry.php', 
                {
                method:'POST',
                headers: {'Content-Type':'application/json'}, 
                body: sendData  
            }).then(response=>response.json()); 

и php

$postData = json_decode(file_get_contents("php://input"), true);
var_dump($postData);

просто возвращает большой жирный NULL.

Редактировать два: оказывается, что его просто нужно кодировать с помощью JSON .stringify (sendData) , С тех пор. Работает как положено.

1 Ответ

1 голос
/ 09 марта 2020

Первое, что я заметил, это то, что вы не используете правильную переменную (вы используете stringData вместо dataString):

dataString = JSON.stringify(dataString); //correctly stringified json

let response = await fetch('updateRecevingEntry.php', {
    method:'POST',
    headers: {'Content-Type':'application/json'}, 
    body: dataString    
}).then(response=>response.json());

Хотя вам не нужно чтобы упорядочить его при отправке с json заголовками.


Кроме того, вы пробовали вместо $_POST, используя php://input?

С PHP. net:

php: // input - это поток только для чтения, который позволяет читать необработанные данные из тела запроса. В случае запросов POST предпочтительно использовать php: // input вместо $ HTTP_RAW_POST_DATA, поскольку это не зависит от специальных директив php .ini. Более того, для тех случаев, когда $ HTTP_RAW_POST_DATA не заполняется по умолчанию, это потенциально менее ресурсоемкая альтернатива активации Always_populate_raw_post_data. php: // ввод недоступен с enctype = "multipart / form-data".

Таким образом, вы бы использовали его так:

$postData = json_decode(file_get_contents("php://input"), true);
$matkey = $postData['materialKey'];

Это читает Тело запроса POST в виде строки JSON преобразует его в массив PHP.

...