json api错误响应不能直接返回raw error,因前端依赖结构化字段判断;必须满足:http状态码与status字段一致、顶层为{"errors":[...]}、每个errorobject含非空title和detail。

JSON API 错误响应为什么不能直接返回 raw error?
因为客户端(尤其是前端)依赖结构化字段做条件判断,Unexpected token 这类错误根本不是 JSON,而是 HTML 错误页混入响应体——说明服务端异常未被捕获,直接透出 500 页面。这类响应连 <code>JSON.parse() 都过不去,更别说提取 code 或 detail。
真正可用的错误响应必须满足三点:
- HTTP 状态码与
Status字段一致(如 404 →"status": "404") - 顶层是
{"errors": [...]}结构,不是{"error": {...}}或裸对象 - 每个
ErrorObject至少含title和detail,且不为空字符串
用 Vue-JSON-Pretty 或 JSONVue 实时高亮错误字段
调试时别再手动折叠展开找 detail —— 工具能自动识别 errors 数组并高亮非 2xx 响应。Vue-JSON-Pretty 在 status ≥ 400 时默认切红色主题;JSONVue 插件遇到 "errors" 键会加粗显示、悬停提示路径 errors[0].detail。
注意两个易踩坑点:
- 如果后端返回的是单个
ErrorObject(没包在errors数组里),Vue-JSON-Pretty 不会触发错误模式,需确认是否漏了ErrorsPayload容器 - JSONVue 对
meta字段内容不做校验,但若meta里塞了函数或 undefined,会导致渲染失败——调试时先删掉meta再看主错误
FastAPI / Spring Boot / Rails 中统一注入 errors 字段
不要在每个路由里手拼 {"errors": [...]}。框架层该做的事就交给框架:
- FastAPI:用
response_model=ErrorsPayload+ 自定义HTTPException子类,重写errors方法返回[ErrorObject(...)] - Spring Boot:在
@ControllerAdvice里拦截JSONAPIException,调用new ErrorsPayload(errors)序列化,而非直接return new ApiResponse(...) - Rails + JSONAPI::Resources:抛
JSONAPI::Exceptions::InvalidResource即可,它内部已实现errors方法,返回标准数组
关键区别在于:直接 return 字典会绕过序列化中间件,code 和 status 字段可能被忽略或转成字符串。
本地调试时用 HTTPie 快速验证错误结构
别等前端联调才发现格式错——用这条命令秒测:
http POST :8000/api/users name=='' | jq '.errors[0].status, .errors[0].detail'
如果返回 null 或报 Cannot index array with string "errors",说明响应根本没走标准错误流程。这时要查两件事:
- 是否所有异常都继承自框架的 base exception(如
JSONAPI::Exceptions::Error) - 是否全局中间件/装饰器被某个路由 bypass 了(比如用了
@app.api_route而非@app.post)
真正难的不是写错格式,而是让错误从 panic 瞬间变成可读、可定位、可归因的 ErrorObject —— 这需要每一层都守住边界,而不是靠最后一道 JSON 序列化兜底。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










