用途:在 Elixir Phoenix 项目中端到端构建或修改 JSON API,包括控制器、路由管线、错误处理与鉴权。
主要能力与规则:
- 使用专门的 :api 管线,不混用 HTML 与 JSON 管线;API 路由跳过 CSRF 与会话。
- 错误渲染为结构化 JSON,{:error, changeset} 转为 {"errors": {...}}。
- 通过 URL 前缀(/api/v1/)进行版本化,而非请求头,理由是可见且可缓存。
- 使用 FallbackController 统一错误处理,每个 action 返回 {:ok, result} 或 {:error, reason}。
使用方式(构建流程):在 :api(或 :api_auth)管线作用域内定义带版本前缀的路由;创建控制器并设置 action_fallback MyAppWeb.FallbackController,每个 action 返回 {:ok, _}/{:error, _};验证错误响应返回结构化 JSON;为受保护作用域添加 ApiAuth 插件,确认缺失或无效令牌返回 401 与 JSON 体;列表端点分页,index 接受 page/per_page 参数并限制上限。
示例要点:管线 :api 使用 plug :accepts, ["json"];:api_auth 使用 plug MyAppWeb.Plugs.ApiAuth。控制器 index 中解析 page/per_page(per_page 上限 100),通过 put_resp_header 设置 x-total-count,返回含 data 与 meta 的 JSON;create 成功时返回 201 与 location 头。FallbackController 分别处理 :not_found、:unauthorized 与 Ecto.Changeset,使用 status 与 %{errors: %{...}} 格式。ApiAuth 从 authorization 头解析 "Bearer " 令牌并 assign current_user,失败时 401 并 halt。
常见陷阱:不要让 JSON 走 :browser 管线;不要用自定义头版本化;不要在 action 内联处理错误;不要返回非结构化错误;不要返回无界集合;不要信任或回显缺失令牌。
适用场景:构建或修改 Phoenix JSON API 控制器、路由管线与错误处理时。限制:资料未提供安装命令、价格、平台与效果等信息。