22 条 API 设计技巧,总结得很好

2023-06-03 0 861

书名镜像:

https://mp.weixin.qq.com/s/z_VTBydcQKQ9R-gGH5C6Dw

在那个微服务项目的当今世界里,后端API的连续性结构设计是不可或缺的。

那时,他们将探讨许多可遵从的最差实践。他们将维持意味深长和浪漫——因此系好安全气囊,起程咯!

具体来说如是说许多名词

任何人API结构设计都遵从一类叫作“面向全国天然资源结构设计”的准则:

天然资源:天然资源是统计数据的一小部分,比如:采用者子集:几组天然资源称作子集,比如:采用者条目URL:标记天然资源或子集的边线,比如:/user

1. 对URL采用kebab-case(短纵线大写分隔方式)

比如,假如你想赢得订货条目。

不假如:

/systemOrders或/system_orders

假如:

/system-orders

2. 模块采用camelCase(之字形方式)

比如,假如你想从两个某一的零售店买回商品。

不假如:

/system-orders/{order_id}

或者:

/system-orders/{OrderId}

假如:

/system-orders/{orderId}

3. 指向子集的复数名称

假如你想赢得系统的所有采用者。

不假如:

GET /user

或:

GET /User

假如:

GET /users

4. URL以子集开始,以标记符结束

假如要维持概念的单一性和连续性。

不假如:

GET /shops/:shopId/category/:categoryId/price

这很糟糕,因为它指向的是两个属性而不是天然资源。

假如:

GET /shops/:shopId/或GET /category/:categoryId

5. 让动词远离你的天然资源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/
22 条 API 设计技巧,总结得很好

拥有良好而详细的文档可以为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/json

17. 对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格式的决定有疑问,这些黄金规则可以帮助他们做出正确的决定。

扁平比嵌套好。简单胜于复杂。字符串比数字好。连续性比定制更好。

就是这样——假如你已经走到了这一步,恭喜你!希望你学到了许多东西。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务