webman中$_post无法获取application/json数据,因php仅解析x-www-form-urlencoded和multipart/form-data;须用file_get_contents('php://input')读取原始json并json_decode($raw, true)解析。

Webman里为什么$_POST拿不到application/json数据
因为 PHP 的 $_POST 只处理 application/x-www-form-urlencoded 和 multipart/form-data 两类请求体,对 application/json 完全无感——它压根不解析,也不会填充到 $_POST 里。
常见错误现象:$_POST 为空、json_decode($_POST) 报错、json_last_error() 返回 JSON_ERROR_SYNTAX(其实你连原始字符串都没拿到)。
- 前端必须显式设置请求头:
Content-Type: application/json - 不能混用
enctype="multipart/form-data",否则php://input不可用 -
php://input只能读一次,后续再调用返回空字符串
正确读取原始 JSON 字符串的唯一方式
必须用 file_get_contents('php://input') 获取原始 body,这是 Webman(以及所有 PHP SAPI)下唯一可靠方式。
示例代码:
$raw = file_get_contents('php://input');
$raw = trim($raw);
// 去 BOM(尤其 Windows 编辑器保存的文件容易带)
if (substr($raw, 0, 3) === "\xEF\xBB\xBF") {
$raw = substr($raw, 3);
}
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
exit('Invalid JSON');
}
-
json_decode($raw, true)的第二个参数必须为true,否则返回stdClass对象,后续用['key']访问会报 Notice - 别用
$request->post()或$request->all(),它们内部已走$_POST路径,会破坏原始数据 - 微信支付回调等敏感验签场景,必须用
$request->getBody()->getContents()(Webman 专用),不能先json_decode再拼原文
Webman中处理 JSON 回调时的时间戳校验陷阱
微信支付等平台回调要求严格校验 WECHATPAY-TIMESTAMP 头与服务器时间差是否在 5 分钟内,否则验签直接失败。
Webman 默认不自动同步系统时区或 NTP,当服务器时间飘移(比如虚拟机休眠后恢复、NTP 同步不稳),这个校验就会静默失败。
- 务必在验签前手动检查:
abs(time() - (int)$request->header('WECHATPAY-TIMESTAMP')) - 别依赖
date_default_timezone_set(),它只影响 PHP 时间函数,不影响time()返回值 - 生产环境建议启用
systemd-timesyncd或配置 cron 定期ntpdate,避免时间漂移累积
全局异常响应不是 JSON?那是没配对地方
Webman 默认异常响应是 HTML 页面,不是 JSON。即使你返回了数组,前端收到的仍是 text/html 类型的裸文本或错误页。
关键配置点:
-
config/exception.php中键名必须是空字符串'',写成'default'或注释残留行都无效 - 自定义处理器类必须实现
Webman\Exception\ExceptionHandlerInterface -
render()方法里必须手动设 header:header('Content-Type: application/json; charset=utf-8') - 返回值必须是
support\Response实例,推荐用response()->json(['code' => 500, 'msg' => $e->getMessage()]) - debug 为 true 时,
$e->getTraceAsString()可能暴露路径,生产环境要过滤或禁用
最易被忽略的是:Webman 不会自动加载你写的 ExceptionHandler,路径注册和接口实现缺一不可,漏一个就退回默认 HTML 错误页。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











