TradingView Widget发送的POST请求自定义PHP API无法接收求助
问题原因与解决方案
你的问题属于PHP接收POST请求的常见场景,核心原因和解决方法如下:
1. 直接原因:JSON格式请求不会填充$_POST
PHP的$_POST超全局变量仅能解析Content-Type为application/x-www-form-urlencoded或multipart/form-data的请求,你测试脚本里发送的是application/json格式的序列化数据,自然不会被写入$_POST,这是PHP的原生设计,不是BUG。
你已经在代码中读取了php://input,只需要对读取到的内容做JSON反序列化即可拿到参数,示例代码:
// 第二个参数传true表示返回关联数组,不传则返回stdClass对象 $postData = json_decode(file_get_contents('php://input'), true);
2. 潜在问题:重定向导致POST数据丢失
你提到请求路径和实际目录存在拼写差异,且访问时浏览器会自动补全路径:
请求地址为:example.com/1.0/chart,实际代码路径为www/1.0/charts/index.php,测试时地址会自动补全为 example.com/1.0/charts/?client=devtg&user=2
这种自动补全一般是服务器配置了301/302重定向规则,而POST请求经过重定向时,默认会被转为GET请求,同时丢失全部POST body。
排查和解决方法:
- 用浏览器开发者工具或者抓包工具查看请求的响应状态码,如果是301/302,直接将请求地址改为和实际路径完全匹配的完整地址(拼写一致、带末尾斜杠)
- 也可以修改Nginx/Apache的重定向规则,配置重定向时保留POST请求参数
3. 快速验证方法
你可以在PHP脚本最顶部增加两行调试代码,确认请求数据是否正常到达服务端:
// 打印请求的Content-Type var_dump($_SERVER['CONTENT_TYPE']); // 打印原始请求body内容 var_dump(file_get_contents('php://input'));
如果可以打印出完整的JSON内容,说明TradingView的请求已经正常发送,按上述第一个方案解析即可;如果打印为空,再进一步排查服务器配置、跨域规则等问题。
内容的提问来源于stack exchange,提问作者Chris_livermore
相关产品推荐
相关产品推荐

