webman的json()函数默认不换行,因底层调用json_encode($data, json_unescaped_unicode)未启用json_pretty_print选项,这是为网络传输优化的设计选择;调试时可手动添加该选项,生产环境应禁用以保障性能。

Webman 的 json() 函数默认不格式化、不换行、中文转义,直接用于调试或前端展示时可读性差;但生产环境开启格式化会增大响应体积、拖慢吞吐,必须按场景开关。
为什么 json() 返回的 JSON 看起来是“挤在一起”的?
因为 Webman 的 json() 函数底层调用的是 json_encode($data, JSON_UNESCAPED_UNICODE),没传 JSON_PRETTY_PRINT —— 这不是 bug,是设计选择:紧凑 JSON 更适合网络传输。
- 错误现象:返回
{"code":0,"msg":"ok","data":{"id":1}},没有缩进和换行,日志里难排查 - 正确做法:仅在开发/调试环境手动加格式化,比如
json($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) - 别在中间件或全局配置里硬编码开启
JSON_PRETTY_PRINT,否则上线后所有接口都变慢、带宽翻倍 - CLI 调试时若看不到换行,用
var_dump()或重定向到文件再查:php test.php > out.json && cat -A out.json
如何让所有 API 响应走统一结构(code/msg/data)?
Webman 没内置“响应适配器”,但提供 response() 和 json() 两个入口,推荐封装一个 app/result/Result.php 工具类,所有控制器只调它,不直调 json()。
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
- 不要在每个控制器里重复写
return json(['code'=>0, 'msg'=>'', 'data'=>$user]),易漏、难维护 - 工具类方法必须显式分离 HTTP 状态码和业务码:比如
Success()返回 HTTP 200,ErrorCode(4001)也返回 HTTP 200(除非真要语义化状态码) - 对
$data做预检:若为mysqli_result、resource或未实现JsonSerializable的对象,抛出明确异常,如Cannot JSON encode resource #7 - 避免在工具类里自动 unset 敏感字段(如
password),那是 Controller 层职责;Result::Success()只负责干净输出
怎么确保 error 分支也走同一套响应逻辑?
很多人在 try/catch 里手写 echo json_encode(['code'=>5001]),结果 header 没设、HTTP 状态码错、结构不一致——前端必须多写 N 个 if 判断。
- 所有分支必须统一走
Result::Success()或Result::ErrorCode(),包括异常捕获路径 - 正常流程:
return Result::Success($user); - 参数错误:
return Result::ErrorCode(4001, '用户名不能为空'); - 数据库异常:
return Result::ErrorCode(5001, '查询失败'); - 绝对不要在
catch里调http_response_code(500)后再echo,这会破坏响应一致性,且可能被框架中间件二次处理
生产环境导出大数组时 json_encode() 失败或超时怎么办?
json_encode() 是内存一次性加载,10 万行记录直接塞进去大概率 OOM 或超时。Webman 不提供流式 JSON 封装,得自己控制节奏。
- 先确认失败原因:调
json_last_error_msg(),常见是JSON_ERROR_UTF8(字段含非法 UTF-8 字节)或JSON_ERROR_RECURSION(对象循环引用) - 导出量大时,别用
SELECT * FROM table全查,改用游标分页 +yield生成器逐批处理 - 每批 500~1000 条,
json_encode()后立即echo并ob_flush(),配合header('X-Content-Type-Options: nosniff')防止浏览器误解析 - 若需完整 JSON 文件下载,建议后台任务生成文件,前端轮询下载链接,而非长连接扛住整个导出过程
最常被忽略的一点:统一响应结构 ≠ 统一 HTTP 状态码。业务错误(如参数校验失败)该用 200 + code=4001,而不是强行设成 400 —— 否则 Nginx 日志、APM 监控、CDN 缓存策略全会误判。Webman 的灵活性恰恰要求你主动做这层语义区分,而不是依赖框架“自动处理”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










