当前位置: 首页 > 知识库问答 >
问题:

带有HTTP PUT的JavaScript Fetch()不向PHP服务器发送FormData

端木飞
2023-03-14

我正在使用PHP rest API将数据从JS客户机发布到PHP8服务器。我正在使用JSfetch()方法。当使用post时,formdata被发送到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

共有1个答案

齐鹏程
2023-03-14

问题不在客户端,而在服务器端。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参考

 类似资料:
  • 我正在尝试从Android向我的php服务器提交数据。然而,所有的答案似乎都使用了不推荐使用的ApacheHTTP库。我不想用它,当我试着用的时候,它不起作用。 现在它似乎什么也没做。它似乎连接到web服务器,但服务器不写入任何数据。如果我只是用浏览器访问url,它会写入一个文件。 php代码是 然后在Android studio中,我会在按下按钮后放入所有代码

  • XMLHttpRequest 对象用于和服务器交换数据。 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send(); 方法 描述 open(method,url,async) 规定请求的类型、URL 以及是否异步处理

  • 我正在开发一个基于云的后端HTTP服务,该服务将公开用于与一些on-prem系统的集成。客户机系统是由外部供应商定制的,它们是带有自己数据库的后端系统。这些系统部署在我们客户的公司中,我们无法访问它们,也无法控制它们。我们向供应商提供我们的API规范,他们实现客户机代码。 我的服务与客户交换的数据格式基于XML,并遵循一定的标准。供应商用不同的编程语言实现他们的客户机系统,随着时间的推移,新的供应

  • 问题内容: 最近5个小时,我一直在尝试将json对象发布到PHP脚本中。我已经阅读了所有文档,似乎代码应该可以,但事实并非如此。发出并接收到请求,但是我无法访问发布的json数据,甚至不知道它是否已正确发送。我不断得到一个空的php数组,而不是json数据。 这是php脚本(test.php) 我正在使用来自https://github.com/pokeb/asi-http- request.gi

  • 我正在尝试用新的Firebase服务向我的android设备发送推送通知。我注册并安装了一个应用程序,同时我把接收通知所需的所有代码都放在了android应用程序中。通过Firebase控制台,我可以向我的应用程序发送一个通知,然后它就会被接收并显示出来。现在我想编写一个java独立服务器,向所有设备发送通知。这是我当前的代码: 这是我从他们的服务器上得到的结果: 不幸的是,简单地移除“to”标记

  • 在行引发异常: 线程“main”javax.net.ssl.SSLHandShaker异常:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:无法在Sun.Security.SSL.Alerts.GetSleXception(