RestApi 规范

1. 协议

API 和用户的交流协议,必须使用HTTPs。




2. 范围

API 应当部署在专用范围名称下。




3. 版本

URL地址里面应当包括API 版本号。


正确示例

v1, v2, v3


错误示例

v-1, 1.2




4. 端点

端点是API的特殊URL,在Restful架构范围内,每个URL代表一个资源,因此URL里面没有动词,只有名词,并且常常对应的是数据库表格名称。总体来说,数据库的表格是相同记录的集合,因此API里面的名词也应该使用复数。
URL的内容需要易懂并且易于创造。所有URL的内容必须是小写。当API 提供一个业务层面资源服务时,不应该在路径里出现此类应用组织的描述(不稳定并且和资源没有必要的业务联系的应用组织)。


正确示例


https://api.example.com/v1/departments?sort=name
https://api.example.com/v1/products/1234
https://api.example.com/v1/employees/



错误示例



https://api.example.com/v1/product/1234               (noun does not use plural)

https://api.example.com/v1/ProductGroup/Update        (case used)

https://api.example.com/v1/prdocuts/query             (verbs used)

https://api.example.com/v1/pcsdproducts/1234          (IT organization information appears)

https://api.example.com/v1/ews/odata/users('jdoe@example.com')/folders('AAMkADdiYzI1MjUzLTk4MjQtNDQ1Yy05YjJkLWNlMzMzYmIzNTY0MwAuAAAAAACzMsPHYH6HQoSwfdpDx-2bAQCXhUk6PC1dS7AERFluCgBfAAABo58UAAA= ') (contains abbreviations and technical terms contents can not be understood)





5. HTTP 动词

HTTP 动词可以代表一个资源的特殊操作类型。通用的HTTP动词有以下5种(对应的圆括号SQL命令)



GET (选择):从服务器中移除资源。

POST (创建):在服务器中创建一个新的资源。

PUT (更新):更新服务器中的资源(客户端提供更新的属性)。

PATCH (更新):更新服务器中的资源(客户端提供更新的属性)。

DELETE (删除):从服务器中删除资源,有两个以上的非普遍性的HTTP动词。

HEAD 得到资源的元数据。

OPTIONS 得到关于客户可以更改哪些资源属性的信息。


这里是一些示例。


GET / products: 列出所有的产品。
POST / products: 创建一个新的产品。
GET / products / {id}: 得到一个特殊产品的信息。
PUT / products / {id}: 更新一个特殊产品的信息。
PATCH / products / {id}: 更新一个特殊产品的部分信息,(信息主体里面需要提供,信息需要更新的部分)。
DELETE / products / {id}: 删除一个产品。
GET / productsgroup / {id} / employees: 列出一个已知产品组的所有产品。
DELETE / productsgroup / {id} / products / {id}: 删除一个已知产品组的特殊产品。





6. 过滤

如果记录数量巨大,服务器将无法返回给用户。API应当提供参数来过滤返回的结果。
这里是一些通用的参数。


? limit = 10: 明确返回的记录的数量。
? offset = 10: 详细说明返回记录的开始。
? page = 2 & pagesize = 100: 详细说明开始的几步,并且还有每页的记录数量。
sortby = name & order = asc:详细说明通过哪些属性去分理结果,还有分理顺序。
? productstype = 1: 明确过滤标准。





7. 状态码

服务器给用户返回的提示和状态码如下所示(方括号内是对应状态码的HTTP 动词):



200 OK - [GET]: 服务器成功返回了用户请求的数据。此操作为幂等操作。

201 CREATED - [POST / PUT / PATCH]: 用户成功创建或修改数据。

202 Accepted - [*]: 提示一个请求在已经在背景队列中(非同步任务)。

204 NO CONTENT - [DELETE]: 用户成功的删除了数据。

400 INVALID REQUEST - [POST / PUT / PATCH]: 用户发送了一个错误请求,服务器没有修改数据或者进行任何其他的新操作,此操作为幂等操作。

401 Unauthorized - [*]: 提示用户没有得到许可(符号,用户名,密码错误)。

403 Forbidden - [*] 提示用户已被授权(与401相反),但是入口已被禁止。

404 NOT FOUND - [*]: 用户请求不存在,并且服务器没有任何操作。此操作是幂等的。

406 Not Acceptable - [GET]: 用户需求的格式不存在(例如,用户需要JSON 格式,但是只有XML格式)。

410 Gone - [GET]: 用户所需求的资源已被永久删除,并且无法找回。

422 Unprocesable entity - [POST / PUT / PATCH] 当创建一个对象的时候,出现验证错误。

500 INTERNAL SERVER ERROR - []: 内部服务器错误- []:服务器发生错误,用户无法得知即将发生的请求是否会成功。





8. 错误处理

如果状态码是4XX,你应该给用户返回了一条错误信息。一般来说,错误信息作为密钥名返回,错误信息即密钥的形式。

{
     error: "Invalid API key"
}




9. 返回

对于不同的操作,服务器返回结果给用户,应当满足以下具体要求。


GET / collection: 返回资源对象清单(队列)。
GET / collection / resource: 返回单独的资源对象。
POST / collection: 返回新生成的资源对象。
PUT / collection / resource: 返回完整的资源对象。
PATCH / collection / resource: 返回完整的资源对象。
DELETE / collection / resource: 返回一个空的文件。



正确示例

"tags": [
  {"id": "125", "name": "Environment"},
   {"id": "834", "name": "Water Quality"}
],


错误示例

用密钥代替字段
"tags": [
   {"125": "Environment"},
   {"834": "Water Quality"}
],




10. 超媒体API

The RESTful API 最好使用超媒体,它能在返回结果里面提供链接,链接到其他API,使用户不受检查,并且知道下一步计划。
例如,当一个用户发送一个请求到api.example.com的根目录下,你可以得到一个像这样的文件。

{"link": {
  "rel": "collection https://www.example.com/products",
  "href": "https://api.example.com/products",
  "title": "list of products",
  "type": "application / vnd.yourformat + json"
}}
以上的代码提示文件有一个链接属性,用户读到这个属性知道下一步调用哪个API,rel代表API和目前的URL的关系(聚合关系,并给出聚合的URL),href 代表API的路径,title 代表API的title, type 代表返回类型。
超媒体API设计叫做HATEOAS。Github's API就是这种设计,访问api.github.com得到所有可获的API的URL的列表。

{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}
从以上你能够看到,如果你想要得到当前用户的信息,你应当访问api.github.com/user,然后得到以下结果。

{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

以上代码提示,服务器给出一个提示和文件的URL。




参考

Wikipedia https://en.wikipedia.org/wiki/Representational_state_transfer
IETF definition https://tools.ietf.org/html/rfc7231
GitHub standard https://developer.github.com/v3/
Microsoft Standard https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值