为了保证持续和及时的更新,强烈推荐在个人Github上关注该项目,欢迎各位star/fork或者帮助翻译git
这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引。github
这篇指南除了详细介绍现有的 API 外,Heroku 未来新加入的内部 API 也会符合这种设计模式,咱们但愿非 Heroku 员工的API设计者也能感兴趣。json
咱们的目标是保持一致性,专一业务逻辑同时避免过分设计。咱们一直试图找出一种良好的、一致的、显而易见的 API 设计方法,而并非所谓的"最终/理想模式"。设计模式
咱们假设你熟悉基本的 HTTP+JSON API 设计方法,因此本篇指南并不包含全部的 API 设计基础。api
咱们欢迎你为这篇指南作贡献。服务器
在默认状况给每个资源一个id
属性。除非有更好的理由,不然请使用UUID。不要使用那种在服务器上或是资源中不是全局惟一的标识,尤为是自动增加的id。app
生成小写的UUID格式 8-4-4-4-12
,例如:url
"id": "01234567-89ab-cdef-0123-456789abcdef"
为资源提供默认的建立时间 created_at
和更新时间 updated_at
,例如:翻译
{ ... "created_at": "2012-01-01T12:00:00Z", "updated_at": "2012-01-01T13:00:00Z", ... }
有些资源不须要使用时间戳那么就忽略这两个字段。设计
在接收和返回时都只使用UTC格式。ISO8601格式的数据,例如:
"finished_at": "2012-01-01T12:00:00Z"
使用嵌套对象序列化外键关联,例如:
{ "name": "service-production", "owner": { "id": "5d8201b0..." }, // ... }
而不是像这样:
{ "name": "service-production", "owner_id": "5d8201b0...", ... }
这种方式尽量的把相关联的资源信息内联在一块儿,而不用改变资源的结构,或者引入更多的字段,例如:
{ "name": "service-production", "owner": { "id": "5d8201b0...", "name": "Alice", "email": "alice@heroku.com" }, ... }
响应错误的时,生成统一的、结构化的错误信息。包含一个机器可读的错误 id
,一我的类能识别的错误信息(message
),根据状况能够添加一个url
来告诉客户端关于这个错误的更多信息以及如何去解决它,例如:
HTTP/1.1 429 Too Many Requests
{ "id": "rate_limit", "message": "Account reached its API rate limit.", "url": "https://docs.service.com/rate-limits" }
文档化客户端可能遇到的错误信息格式,以及这些可能的错误信息id
。
客户端的访问速度限制能够维护服务器的良好状态,保证为其余客户端请求提供高性的服务。你可使用token bucket algorithm技术量化请求限制。
为每个带有RateLimit-Remaining
响应头的请求,返回预留的请求tokens。
请求中多余的空格会增长响应大小,并且如今不少的HTTP客户端都会本身输出可读格式("prettify")的JSON。因此最好保证响应JSON最小化,例如:
{"beta":false,"email":"alice@heroku.com","id":"01234567-89ab-cdef-0123-456789abcdef","last_login":"2012-01-01T12:00:00Z","created_at":"2012-01-01T12:00:00Z","updated_at":"2012-01-01T12:00:00Z"}
而不是这样:
{ "beta": false, "email": "alice@heroku.com", "id": "01234567-89ab-cdef-0123-456789abcdef", "last_login": "2012-01-01T12:00:00Z", "created_at": "2012-01-01T12:00:00Z", "updated_at": "2012-01-01T12:00:00Z" }
你能够提供可选的方式为客户端提供更详细可读的响应,使用查询参数(例如:?pretty=true
)或者经过Accept
头信息参数(例如:Accept: application/vnd.heroku+json; version=3; indent=4;
)