JavaScript 使用 HTTP PUT 的 Fetch() 未将 FormData 发送到 PHP 服务器

JavaScript Fetch() with a HTTP PUT is not sending FormData to PHP server

我正在使用 PHP rest API 到 post 从 JS 客户端到 PHP 8 服务器的数据。 我正在使用 JS fetch() 方法。当使用 POST 时,表单数据被发送到 PHP 的全局 $_POST,但由于我需要更新数据,所以我必须使用 PUT。不知何故 Google Chrome 没有将表单数据发送到服务器,我不知道为什么。有人知道原因吗?

JS:

const formData = new FormData();
formData.append('title', 'Hello world');

const options = {
    method: 'PUT',
    body: JSON.stringify(formData);
    cache: 'no-cache',
    mode: 'cors',
    credentials: 'same-origin',
    redirect: 'follow',
    referrer: 'no-referrer',
    
    // Not working either
    // headers: {
    //     'Content-Type': 'application/json; charset=UTF-8;'
    // },
};

fetch('/some/api/v1', options);
PHP 8 server:

var_dump($_REQUEST); // NULL

问题不在客户端,而是在服务器端。 Firefox 和 Chrome 都序列化数据并使用以下代码发送:

document.getElementById('myForm').addEventListener('submit', function(e){
            e.preventDefault();
            let fd = new FormData(this);
            fetch('test.php', {method:'PUT', body:fd})
            .then(function(response){
                response.text().then(function(txt){console.log("Response:"+txt);});
            });
        });

问题在于 PHP 支持 PUT,它不会自动为您解压数据。您可以从 stdin 流中获取它。

/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
while ($data = fread($putdata, 1024)) {
    echo $data;
}

回复:

-----------------------------256278305409917102757952731 
Content-Disposition: form-data; 
name="myText" ffsssssdd 
-----------------------------256278305409917102757952731-- 

如果您想将表单数据作为 JSON 对象发送,您可以使用:

const serialize_form = form => JSON.stringify(
    Array.from(new FormData(form).entries())
        .reduce((m, [ key, value ]) => Object.assign(m, { [key]: value }), {})
        );
           
const json = serialize_form(this);
fetch('test.php', {method:'PUT', body:json, headers:{'content-type':'application/json'}})
    .then(function(response){
         response.text().then(function(txt){console.log("Response:"+txt);});
                });

回复:

{"myText":"ghfghfghfg"}

取自

serialize_form函数

PHP reference