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 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
函数