Code前端首页关于Code前端联系我们

微服务时代 API 设计的 22 种最佳实践

terry 2年前 (2023-09-24) 阅读数 73 #后端开发

对糟糕的 API 感到沮丧?

在微服务领域,后端 API 的一致设计至关重要。

今天我们将讨论一些需要遵循的最佳实践。我们会保持简短和甜蜜 - 所以插入它并开始吧!

先介绍一些术语

任何API设计都遵循“面向资源的设计”原则:

  • 资源:资源就是一段数据,例如:用户
  • 集合:一组资源它称为集合,例如:用户列表
  • URL:标识资源或集合的位置,例如:/user

1。使用 kebab 大小写(连字符分隔形式)作为 URL

,例如,如果您想要获取订单列表。

不:

/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 属性使用驼峰命名法

如果您正在构建请求正文或响应正文为 JSON 的系统,则属性名称必须使用驼峰命名法。

性别:

{
用户名:“Mohammad Faisal”
用户 ID:“1”
}
}
} } 用户名:“Mohammad Faisal " "
userId: "1"
}

8. 监控

RESTful HTTP 服务必须实现 /health 和 /version 以及 /metricsAPI 端点。他们提供以下信息。

/health

使用状态代码 200 OK 响应 /health 请求。

/version

使用版本号响应 /version 请求。

/指标

此端点提供各种指标,例如平均响应时间。

还强烈建议使用 /debug 和 /status 端点。

9。不要使用 table_name 作为资源名称

不要仅使用 table_name 作为资源名称。从长远来看,这种懒惰是有害的。

否:

product_order

product-orders

这是因为它并不是为了揭示底层架构。

10。使用 API 设计工具

有很多好的 API 设计工具可以用来编写好的文档,例如:

  • API 蓝图:https://apiblueprint.org/
  • Swagger:https:///swagger.io/

良好且详细的文档可以为API使用者提供良好的用户体验。

11。对版本使用简单的序列号

始终对 API 使用版本号,并将其向左移动以获得最大范围。版本号为 v1、v2 等。一定是有价值的。如果 API 由外部实体使用,则

必须。

12。在响应正文中指定资源总数

如果 API 返回对象列表,则响应始终包含资源总数。为此,您可以使用total 属性。

否:

{
用户:[
...
]
}
}
}

GET /getusers

用户:[
.. .
],
总计:34
}

13。接受限制和偏移参数

在 GET 操作中始终接受限制和偏移参数。

应该是:

GET /shops?offset=5&limit=5

这是因为首页分页需要它。

14。检索字段查询参数

还必须考虑返回的数据量。添加字段参数以仅显示 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。使用 HTTP 方法实现 CRUD 功能

HTTP 方法用于解释 CRUD 功能。

GET:获取资源的表示形式。

POST:创建新资源和子资源。

PUT:更新现有资源。

PATCH:更新现有资源,仅更新指定字段,不更新其他字段。

DELETE:删除现有资源。

18。使用嵌入资源 URL 中的链接

以下是一些实际示例:

  • GET /shops/2/products:获取商店 2 中所有产品的列表。
  • GET /shops/2/products/31:获取产品 31 的详细信息。产品 31 属于商店 2。
  • DELETE /stores/2/products/31:必须删除产品 31,它属于商店 2。
  • PUT /shops/2/products/31:需要更新产品 31 信息,仅在资源 URL 上使用 PUT,而不是在集合上使用 PUT。
  • POST /shops:创建一个新商店并返回创建的新商店的详细信息。对集合 URL 使用 POST。

19。 CORS(跨源资源共享)

确保所有公共 API 支持 CORS(跨源资源共享)标头。

考虑支持启用 CORS 的“*”源并使用有效的 OAuth 令牌强制授权。

避免将用户凭据与原始身份验证相结合。

20。安全性

在所有端点、资源和服务上实施 HTTPS(tls 加密)。

强制并要求所有回调 URL、推送通知端点和 Webhook 使用 HTTPS

21。错误

当客户端向服务发出无效或不正确的请求,或者向服务提供无效或不正确的数据,而服务拒绝请求时,或者更准确地说,发生服务错误时,就会发生错误。

示例:无效凭证、错误参数、未知版本 ID 等。

  • 如果客户端请求由于一个或多个服务错误而被拒绝,请务必返回 4xx HTTP 错误代码。
  • 考虑处理所有属性并在单个响应中返回多个验证问题。

22。黄金法则

如果您对 API 格式决策有疑问,这些黄金法则可以帮助您做出正确的决定。

  • 平放比嵌入更好。
  • 简单胜于复杂。
  • 字符串比数字更好。
  • 一致性比定制更好。

就是这样 - 如果您已经完成了这一步,那么恭喜您!我希望你学到了一些东西。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门