无法从本地React应用向WordPress Rest API发送POST请求(ERR_EMPTY_RESPONSE)
解决本地React应用调用WordPress REST API的网络错误问题
嘿,我之前也碰到过类似的情况——Postman和Node脚本都能正常创建文章,但React本地应用里直接报错,服务器还没收到请求,这说明请求大概率被浏览器的安全机制或者本地环境给拦截了。既然你已经配置了CORS,那可以试试下面这些方案:
1. 搞定混合内容问题
如果你的WordPress站点是HTTPS的,而本地Create-React-App默认跑在HTTP上,浏览器会因为混合内容的安全规则直接拦截请求。你可以:
- 启动本地服务时强制开启HTTPS:终端运行
HTTPS=true npm start(Windows系统用set HTTPS=true && npm start) - 这样本地应用就用HTTPS运行,和WordPress站点的协议一致,就能绕过这个限制
2. 再核对下Authorization头
虽然Postman里能用,但浏览器环境下有时候字符串格式会出问题:
- 确保
Bearer和你的token之间有一个空格,比如"Authorization": 'Bearer YOUR_TOKEN'(你的代码里看起来格式是对的,但可以再检查下token有没有复制错,比如末尾有没有多余空格) - 也可以把token单独存变量,用模板字符串拼接,避免手动输入出错:
const wpToken = 'YOUR_HIDDEN_TOKEN'; axios({ method: 'post', headers: { "Authorization": `Bearer ${wpToken}` }, url: 'YOUR_WP_SITE_URL/wp-json/wp/v2/posts', data: { title: "Test" } })
3. 检查浏览器插件的拦截
很多隐私保护、广告拦截插件会自动拦截带有Authorization头的跨域请求:
- 先把浏览器所有插件暂时禁用,再测试请求
- 如果禁用后正常,找到对应的插件,把你的WordPress站点和本地开发地址(比如
https://localhost:3000)加入白名单
4. 用CRA代理绕过浏览器跨域
Create-React-App自带代理功能,能让本地服务器帮你转发请求,直接绕过浏览器的CORS检查:
- 在项目的
package.json里添加一行:"proxy": "https://your-wordpress-site-url.com" - 然后把Axios的请求URL改成相对路径:
axios({ method: 'post', headers: { "Authorization": 'Bearer HIDDEN' }, url: '/wp-json/wp/v2/posts', data: { title: "Test" } }) - 重启本地开发服务器,这样请求会先经过CRA的代理服务器转发,浏览器就不会触发跨域限制了
5. 排查WordPress的安全插件
像Wordfence、iThemes Security这类安全插件,会默认拦截陌生来源的REST API请求,尤其是带Bearer token的:
- 暂时禁用WordPress上的所有安全插件,再测试请求
- 如果禁用后正常,在安全插件的设置里,把本地开发的IP地址或者CORS允许的域名加入白名单
- 另外别忘了确认你的token对应的WordPress用户有创建文章的权限(需要
edit_posts权限)
6. 检查Axios的全局配置
如果你在应用里加了Axios的全局拦截器,可能无意中修改了请求头或者阻止了请求发送:
- 先移除所有Axios的全局拦截代码,只保留当前的请求测试
- 检查有没有全局配置的
baseURL和你的请求URL冲突
最后,你可以打开浏览器开发者工具的Network标签,看看请求状态:如果请求显示(canceled)或者根本没记录,那就是浏览器端拦截了;如果有请求记录但返回4xx/5xx,再看响应内容具体排查。
内容的提问来源于stack exchange,提问作者Robert_mk




