XMLHttpRequest无法POST数据求助(新手)
解决XMLHttpRequest POST请求404和JSON解析错误的问题
我来帮你一步步排查这个问题,从错误信息和代码来看,主要是路径匹配错误和请求参数格式不对这两个核心问题,咱们逐个解决:
一、先搞定404错误:URL路径要匹配实际文件位置
你的文件结构是根目录下有index.php、store.php,init.js在js/文件夹里。那从init.js的位置出发,要访问根目录的store.php,正确的相对路径应该是../store.php(../表示回到上级目录,也就是根目录)。
你之前试的各种路径里,硬编码的http://localhost/thissite/store.php如果和表单提交的目标URL完全一致的话理论上也能行,但相对路径更灵活,不会因为域名或站点根目录变化出问题。
另外,错误信息里显示请求的是http://localhost/thissite/post,这说明你代码里的URL可能和实际要访问的store.php不匹配,一定要确保XMLHttpRequest的url和HTML表单的action属性完全相同。
二、修复JSON解析错误:参数格式不能用HTML实体
你在xmlhttp.send()里写的参数用了&,这是HTML里用来转义&的字符,但在JavaScript字符串里不需要这么做!直接用&分隔参数就可以了。
如果用&,PHP会把它当成参数的一部分,导致参数解析失败,返回的不是你预期的JSON,而是错误提示的HTML页面——这就是为什么你会看到Unexpected token < in JSON at position 0的错误(因为返回的HTML开头是<标签,不是JSON格式)。
修正后的完整代码
function sendData() { let xmlhttp; // 用相对路径更可靠,适配不同环境 const url = "../store.php"; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { // 兼容旧IE的写法可以保留,但现在几乎没人用了 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST", url, true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 把&换成&,正确的参数分隔方式 xmlhttp.send("sitetarget=/thissite/&buttontarget=firstbutton&amount=2"); // 加上响应处理,方便调试 xmlhttp.onload = function() { if (this.status >= 200 && this.status < 400) { try { const response = JSON.parse(this.responseText); console.log("请求成功,响应数据:", response); } catch (e) { console.error("JSON解析失败,返回内容:", this.responseText); // 这里可以看到返回的到底是啥,方便排查PHP返回的问题 } } else { console.error("请求出错,状态码:", this.status); } }; xmlhttp.onerror = function() { console.error("请求发生网络错误"); }; }
额外调试建议
- 打开浏览器开发者工具(F12),切换到Network标签,触发
sendData()函数,查看请求的URL、参数、响应内容,确认和表单提交的请求是否一致。 - 检查
store.php的文件权限,确保Web服务器有权限读取和执行它。 - 如果还是有问题,查看Web服务器的访问日志,看看404错误的具体路径,确认站点根目录的映射是否正确。
内容的提问来源于stack exchange,提问作者MAXaddictable
相关产品推荐
相关产品推荐

