Uniapp调用Webman接口失败主因是请求体解析、参数校验、错误响应格式未对齐:需用$request->json()读JSON,validate须try/catch转JSON返回,WaUsers模型需手动设时间戳/IP,注意字段名大小写及HTTPS证书问题。

Uniapp 调用 Webman 后台接口失败,大概率不是跨域或 token 问题,而是请求体解析、参数校验、错误响应格式这三处没对齐。
Uniapp 默认发的是 application/json,但 Webman Request::post() 只读 application/x-www-form-urlencoded 和 multipart/form-data
Uniapp 的 uni.request() 默认 Content-Type 是 application/json,而 Webman 的 $request->post() 默认不解析 JSON 请求体——它只从 $_POST(表单)或 php://input(需手动读)取数据。
- 直接用
$request->post()接收 JSON 数据,结果永远是空数组 - 正确做法:统一改用
$request->json()读取 JSON body,或在前端显式设置header: {'Content-Type': 'application/x-www-form-urlencoded'}并用uni.upx2px()等工具序列化参数 - 如果必须兼容两种格式,可封装一个通用读参函数:
function getRequestBody(Request $request) { $contentType = $request->header('content-type', ''); if (stripos($contentType, 'application/json') === 0) { return $request->json() ?: []; } return $request->post(); }
Webman 的 validate 报错返回是 HTML 或异常堆栈,Uniapp 拿不到 code/msg 结构
Respect\Validation 默认抛出异常,Webman 没做统一异常捕获时,会直接输出 PHP 错误页或空白响应,Uniapp 的 fail 回调里看到的是 statusCode: 500 或网络错误,根本不知道哪条规则没过。
- 别在控制器里裸写
v::key(...)->assert($data),必须包在try/catch里,手动转成 JSON 响应 - 推荐写法:
try { v::key('username', v::stringType()->length(4, 20)) ->key('password', v::stringType()->length(6, 32)) ->assert($request->json()); } catch (\Respect\Validation\Exceptions\NestedValidationException $e) { return json(['code' => 400, 'msg' => $e->getMessages()[0]]); } - 更稳妥的做法:在中间件层统一拦截
Respect\Validation\Exceptions\ValidationException,避免每个接口重复写 try/catch
Webman Admin 插件的 WaUsers 模型默认不支持 create() 直接写入时间戳和 IP
你加了 register_time 和 register_ip 字段,但 WaUsers::create([...]) 不会自动填充它们——Laravel 风格的 $fillable + protected $casts + 自动时间戳在 Webman Admin 的模型里默认是关闭的。
立即学习“PHP免费学习笔记(深入)”;
- 手动补全:
$user = WaUsers::create([ 'username' => $username, 'password' => password_hash($password, PASSWORD_DEFAULT), 'source' => 'miniprogram', 'register_ip' => $ip, 'register_time' => date('Y-m-d H:i:s'), 'status' => 1 ]); - 或者在模型里启用 Laravel 风格时间戳(如果用的是 ThinkORM):
protected $autoWriteTimestamp = true;,但注意 Webman Admin 默认用的是原生 PDO,没开这个特性 - 字段名大小写敏感:数据库是
register_time,代码里写成registerTime就会静默丢弃
最常被忽略的点:Uniapp 的 https 请求在真机调试时可能被系统证书策略拦截,而 Webman 默认不配 HTTPS —— 别急着改后端,先用 Fiddler 或 Charles 抓包确认是 504 超时、还是 502 Bad Gateway、还是前端根本没发出请求。很多“接口不通”问题,其实卡在域名没备案、SSL 证书没续期、或 Nginx 没透传 X-Real-IP 头导致 $request->getRealIp() 返回 127.0.0.1。



















