【问题标题】:API Gateway URI VersioningAPI Gateway URI 版本控制
【发布时间】:2020-11-26 20:01:06
【问题描述】:

我不断看到 cmets 关于如何在 API Gateway 中进行 URI 版本控制,这些都说同样的话,

不要将版本路径 (/v1) 创建为 API 中的资源。相反,只需调用 API“Names V1”并开始创建资源 (/names)。当您想要进行重大更改并创建 API 的新版本时,我们建议您创建一个名为“Names V2”的全新 API。再次,只需创建没有版本路径的资源。

要将这两个 API 结合在一起,您可以使用自定义域名。 API Gateway 中的自定义域名包括完全限定域名和基本路径。创建两个自定义域名:

myapi.com/v1 -> 指向 Names V1 API 的 prod 阶段

myapi.com/v2 -> 指向 Names V2 API 的 prod 阶段

但是,当您尝试创建包含“/”的自定义域名时,API 网关会以“无效域名”响应。因此,如果您尝试在映射上执行此操作,您会得到类似的信息,提及您可以使用的特殊字符,而“/”不是其中之一。所以你唯一的选择是使用阶段变量,这些帖子提到了这样做的挑战。

此外,如果您只是将其设为“v1”而不使用斜线,那么我们将无法拥有像“api.whatever.com”这样的自定义域。然后使自定义域特定于需要版本化的 API 区域。前任。 “stores.whatever.com”。这会导致每个 API 都有自己的子域。

URI-based Versioning for AWS API Gateway API Versioning with AWS API Gateway

很抱歉提出一个新问题,但我不能对帖子添加评论。

【问题讨论】:

  • 我已经删除了我的答案,因为它显然没有回答你的问题。我认为允许不同区域的方法是将这些区域包含在 API 定义和 API 版本中,因此您将拥有 v1/stores 而不是 stores/v1。路径只是 v1,但 API 定义将包括这些区域。
  • 感谢您试一试。我正在与我们的 Ops 团队进行此对话,他们希望拥有类似“api.whatever.com”的内容,然后将 API 映射到特定的 api 网关,例如“商店”,但不希望 v1 在资源或阶段中,(我不希望它在阶段)。但是唯一需要做 URI 版本控制的地方是在资源中,并且仍然可以按照他们想要的方式进行自定义域和 API 映射……因为路径中不能有“/”。

标签: amazon-web-services aws-api-gateway


【解决方案1】:

我不确定我是否理解这里的请求,让我试着澄清一下。当您的自定义域名api.whatever.com 收到请求时,API Gateway 需要确定将请求发送到何处。 API Gateway 将查看路径,然后确定该路径是否有任何 API:STAGE 映射。您可以在自定义域名上配置一个空的基本路径映射,但是所有没有该自定义域名路径的请求都将被路由到 API:STAGE 映射。似乎您正在尝试将请求路由到 api.whatever.comstores.whatever.com,您可以使用两个自定义域名来执行此操作,每个域名都有自己的空基本路径映射。例如:

自定义域名1:api.whatever.com

  • api-id: 12345
  • stage:直播
  • api-mapping-key: NULL

自定义域名2:stores.whatever.com

  • api-id: 67890
  • stage:测试版
  • api-mapping-key:

您的客户在调用您的 API 时必须指定正确的域名。

【讨论】:

  • 问题是如何处理 API 的版本控制。在通过 StackOverflow 上的 URI 版本控制进行 API 版本控制的其他答案中,据说不要在您的资源中添加“v1”并将其添加到自定义域名部分的 API 映射中。但是,如果您有一个通用的自定义域名,例如“api.whatever.com”,并且还有多个 api,例如“stores”和“inventory”,那么您将无法添加“v1”,因为您不能拥有“ /”在自定义域名的API Mapping中。因此,剩下的就是添加“v1”作为您的 api 的顶级资源。
  • 能否将您的 API 命名为“storesV1”、“storesV2”、“inventoryV1”、“inventoryV2”,然后配置您的自定义域名基本路径映射以引用这些 API?按照 CDN:API:STAGE:PATH 格式,映射将如下所示:api.whatever.com:storesV1:Live:v1api.whatever.com:storesV2:Live:v2。这意味着调用 api.whatever.com/v2 的客户会将他们的请求路由到“storesv2”API 的 Live 阶段
  • 如果我明白你在说什么,v1 最终会成为 API 中的资源。这很好,我做了什么,但来自 Stefano Buliani 的建议是不要将版本作为 API 中的资源并将其构建到 API 映射中。所以我的方式就是你解释它的方式(我认为); CDN = api.whatever.com,API:STAGE = storesV1:Live -> storefinder,PATH = /v1/stores; /v1/stores/{number}...例如api.whatever.com/storefinder/v1/stores 和 api.whatever.com/storefinder/v1/stores/14。
  • 不,不要在您的 API 中创建 /v1 资源。您的 API 将从 / 根资源开始。创建附加到根的“存储”资源。在您的自定义域名基本路径映射中,您将执行:api.whatever.com:storesV1:Live:stores。这意味着当客户端调用api.whatever.com/stores 时,API Gateway 会将这些请求映射到您的storesV1 API 的Live 阶段,同时将v1 排除在阶段和路径之外。当您想要对 API 进行版本化时,可以更新基本路径映射。希望这会有所帮助!
  • 不幸的是它没有。我们已经遇到了同时需要 v0(又名 /stores)和 v1 的情况,直到我们可以更新我们的移动应用程序以使用 v1。听起来在资源中添加 /v1 是获取 URI 版本控制的唯一正确方法,直到 API Gateway 团队允许在基本路径映射中使用“/”。
猜你喜欢
  • 2017-06-25
  • 2016-12-23
  • 2019-10-24
  • 2016-11-01
  • 2017-09-23
  • 2012-05-31
  • 2016-05-22
  • 2016-03-21
  • 1970-01-01
相关资源
最近更新 更多