Webman接收Flutter JSON请求需用$request->json()而非$post(),校验失败须try/catch转JSON返回,字段名大小写、时间戳/IP处理及登录态(Cookie/Token双模式)必须严格对齐。

Flutter前端发JSON,Webman后端收不到参数
直接用 $request->post() 拿不到数据,因为 Flutter 默认走 application/json,而 Webman 的 post() 只解析表单和文件上传两种格式。
- 必须改用
$request->json()读取请求体,且需确保前端没手动覆盖Content-Type - 如果后端要兼容表单和 JSON 两种格式,封装一个读参函数更稳妥:
function getRequestBody(Request $request) { $contentType = $request->header('content-type', ''); if (stripos($contentType, 'application/json') === 0) { return $request->json() ?: []; } return $request->post(); } - 别在控制器里混用
$request->post()和$request->json(),容易漏判空值或类型错误
validate失败时Flutter收不到code/msg结构
Respect\Validation 抛异常后,Webman 默认返回 HTML 错误页或空白响应,Flutter 的 http 或 dio 请求只会拿到 500 状态码,根本看不到具体哪条规则不通过。
- 所有校验必须包在
try/catch里,手动转成 JSON 格式返回:try { Validation::key('username', v::stringType()->length(2, 20)) ->assert($data); } catch (NestedValidationException $e) { return json(['code' => 400, 'msg' => $e->getMessages()[0]]); } - 不要依赖全局异常处理器——Flutter 不认 PHP 异常堆栈,只认
code、msg、data这三个字段 - 字段名大小写要跟 Flutter 模型严格一致(比如
user_name≠userName),否则解包失败
Flutter登录态在Webman里失效或权限错乱
Flutter Web 端依赖 Cookie 维持 session,但默认请求不带凭据;Flutter 移动端(Android/iOS)又不用 Cookie,靠 header 传 token——两边逻辑不统一就崩。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- Web 端必须显式开启凭据:
withCredentials: true(Dio 配置里设withCredentials: true) - 移动端一律走 Bearer Token:Flutter 登录成功后存 token,后续请求加
Authorization: Bearer xxx - Webman 后端要同时支持两种方式:
if ($request->hasHeader('Authorization')) { $token = $request->header('Authorization'); // 解析并验证 JWT } else { // 读 $_SESSION 或 PHPSESSID Cookie } - 别把 Web 和 App 的用户表字段混用——比如
openid字段在 Web 端为空,在小程序端必填,模型层得做条件赋值
数据库字段与Flutter模型字段不一致导致写入失败
最常被忽略的是字段默认值和 NULL 约束。比如 Webman 模型设了 created_at 自动填充,但 Flutter 发来的 JSON 里没这字段,MySQL 会因 strict mode 报错。
- 所有时间戳字段(
created_at、updated_at)必须在 Webman 模型里显式设为可空或自动填充:$fillable = ['name', 'email'];,别漏掉动态字段 - IP 地址字段(如
last_login_ip)不能直接存$request->ip(),得先判断是否为 IPv4/IPv6,否则 MySQL 插入失败 - Flutter 侧发来的布尔字段(
is_active)是true/false,PHP 接收后得转成1/0再入库,不然字段类型不匹配
关键点不在“能不能通”,而在“字段、协议、状态维持”三者是否对齐。任何一环松动,Flutter 看到的都是黑盒错误。










