书名镜像:
https://mp.weixin.qq.com/s/z_VTBydcQKQ9R-gGH5C6Dw在那个微服务项目的当今世界里,后端API的连续性结构设计是不可或缺的。
那时,他们将探讨许多可遵从的最差实践。他们将维持意味深长和浪漫——因此系好安全气囊,起程咯!
具体来说如是说许多名词
任何人API结构设计都遵从一类叫作“面向全国天然资源结构设计”的准则:
天然资源:天然资源是统计数据的一小部分,比如:采用者子集:几组天然资源称作子集,比如:采用者条目URL:标记天然资源或子集的边线,比如:/user1. 对URL采用kebab-case(短纵线大写分隔方式)
比如,假如你想赢得订货条目。
不假如:
/systemOrders或/system_orders假如:
/system-orders2. 模块采用camelCase(之字形方式)
比如,假如你想从两个某一的零售店买回商品。
不假如:
/system-orders/{order_id}或者:
/system-orders/{OrderId}假如:
/system-orders/{orderId}3. 指向子集的复数名称
假如你想赢得系统的所有采用者。
不假如:
GET /user或:
GET /User假如:
GET /users4. URL以子集开始,以标记符结束
假如要维持概念的单一性和连续性。
不假如:
GET /shops/:shopId/category/:categoryId/price这很糟糕,因为它指向的是两个属性而不是天然资源。
假如:
GET /shops/:shopId/或GET /category/:categoryId5. 让动词远离你的天然资源URL
不要在URL中采用动词来表达你的意图。相反,采用适当的HTTP方法来描述操作。
不假如:
POST /updateuser/{userId}或:
GET /getusers假如:
PUT /user/{userId}6. 对非天然资源URL采用动词
假如你有两个端点,它只返回两个操作。在这种情况下,你可以采用动词。比如,假如你想向采用者重新发送警报。
假如:
POST /alarm/245743/resend请记住,这些不是他们的CRUD操作。相反,它们被认为是在他们的系统中执行某一工作的函数。
7. JSON属性采用camelCase之字形方式
假如你正在构建两个请求体或响应体为JSON的系统,那么属性名假如采用之字形大大写。
不假如:
{ user_name: “Mohammad Faisal” user_id: “1” }假如:
{ userName: “Mohammad Faisal” userId: “1” }8. 监控
RESTful HTTP服务项目必须实现/health和/version和/metricsAPI端点。他们将提供以下信息。
/health
用200 OK状态码响应对/health的请求。
/version
用版本号响应对/version的请求。
/metrics
那个端点将提供各种指标,如平均响应时间。
也强烈推荐采用/debug和/status端点。
9. 不要采用table_name作为天然资源名
不要只采用表名作为天然资源名。从长远来看,这种懒惰是有害的。
不假如:
product_order假如:
product-orders这是因为公开底层体系结构不是你的目的。
10. 采用API结构设计工具
有许多好的API结构设计工具用于编写好的文档,比如:
API蓝图:https://apiblueprint.org/Swagger:https://swagger.io/拥有良好而详细的文档可以为API采用者带来良好的采用者体验。
11. 采用简单序数作为版本
始终对API采用版本控制,并将其向左移动,使其具有最大的作用域。版本号假如是v1,v2等等。
假如:
http://api.domain.com/v1/shops/3/products始终在API中采用版本控制,因为假如API被外部实体采用,更改端点可能会破坏它们的功能。
12. 在你的响应体中包括总天然资源数
假如API返回两个对象条目,则响应中总是包含天然资源的总数。你可以为此采用total属性。
不假如:
{ users: [ … ] }假如:
{ users: [ … ], total: 34 }13. 接受limit和offset模块
在GET操作中始终接受limit和offset模块。
假如:
GET /shops?offset=5&limit=5这是因为它对于前端分页是必要的。
返回的统计数据量也假如考虑在内。添加两个fields模块,只公开API中必需的字段。
例子:
只返回零售店的名称,地址和联系方式。
GET /shops?fields=id,name,address,contact在某些情况下,它还有助于减少响应大小。
15. 不要在URL中通过认证令牌
这是一类非常糟糕的做法,因为url经常被记录,而身份验证令牌也会被不必要地记录。
不假如:
GET /shops/123?token=some_kind_of_authenticaiton_token相反,通过头部传递它们:
Authorization: Bearer xxxxxx, Extra yyyyy此外,授权令牌假如是短暂有效期的。
16. 验证内容类型
服务项目器不假如假定内容类型。比如,假如你接受application/x-www-form-urlencoded,那么攻击者可以创建两个表单并触发两个简单的POST请求。
因此,始终验证内容类型,假如你想采用默认的内容类型,请采用:
content-type: application/json17. 对CRUD函数采用HTTP方法
HTTP方法用于解释CRUD功能。
GET:检索天然资源的表示方式。
POST:创建新的天然资源和子天然资源。
PUT:更新现有天然资源。
PATCH:更新现有天然资源,它只更新提供的字段,而不更新其他字段。
DELETE:删除已存在的天然资源。
18. 在嵌套天然资源的URL中采用关系
以下是许多实际例子:
GET /shops/2/productsGET /shops/2/products/31DELETE /shops/2/products/31:假如删除商品31,它属于零售店2。PUT /shops/2/products/31:假如更新商品31的信息,只在resource-URL上采用PUT,而不是子集。POST /shops:假如创建两个新的零售店,并返回创建的新零售店的详细信息。在子集url上采用POST。19. CORS(跨源天然资源共享)
一定要为所有面向全国公共的API支持CORS(跨源天然资源共享)头部。
避免将采用者凭证与原始验证相结合。
20. 安全
在所有端点、天然资源和服务项目上实施HTTPS(tls加密)。
强制并要求所有回调url、推送通知端点和webhooks采用HTTPS。
21. 错误
当客户端向服务项目发出无效或不正确的请求,或向服务项目传递无效或不正确的统计数据,而服务项目拒绝该请求时,就会出现错误,或者更具体地说,出现服务项目错误。
例子包括无效的身份验证凭证、不正确的模块、未知的版本id等。
当由于两个或多个服务项目错误而拒绝客户端请求时,一定要返回4xx HTTP错误代码。考虑处理所有属性,然后在单个响应中返回多个验证问题。22. 黄金法则
假如您对API格式的决定有疑问,这些黄金规则可以帮助他们做出正确的决定。
扁平比嵌套好。简单胜于复杂。字符串比数字好。连续性比定制更好。就是这样——假如你已经走到了这一步,恭喜你!希望你学到了许多东西。