问题标签 [api-versioning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
9719 浏览

rest - 您如何管理版本化 API 的底层代码库?

我一直在阅读有关 ReST API 的版本控制策略,但它们似乎都没有解决您如何管理底层代码库的问题。

假设我们正在对 API 进行一系列重大更改 - 例如,更改我们的 Customer 资源,使其返回单独的forenamesurname字段而不是单个name字段。(对于本示例,我将使用 URL 版本控制解决方案,因为它很容易理解所涉及的概念,但该问题同样适用于内容协商或自定义 HTTP 标头)

我们现在在 处有一个端点,在 处有http://api.mycompany.com/v1/customers/{id}另一个不兼容的端点http://api.mycompany.com/v2/customers/{id}。我们仍在为 v1 API 发布错误修复和安全更新,但新功能开发现在都集中在 v2 上。我们如何编写、测试和部署对 API 服务器的更改?我至少可以看到两种解决方案:

  • 为 v1 代码库使用源代码控制分支/标记。v1 和 v2 是独立开发和部署的,在必要时使用修订控制合并来将相同的错误修复应用于两个版本 - 类似于在开发主要新版本同时仍支持以前版本时管理本机应用程序的代码库的方式。

  • 使代码库本身了解 API 版本,因此您最终会得到一个包含 v1 客户表示和 v2 客户表示的单一代码库。将版本控制视为解决方案架构的一部分,而不是部署问题——可能使用命名空间和路由的某种组合来确保请求由正确的版本处理。

分支模型的明显优势是删除旧的 API 版本很简单——只需停止部署适当的分支/标签——但如果你运行多个版本,你最终可能会得到一个非常复杂的分支结构和部署管道。“统一代码库”模型避免了这个问题,但是(我认为?)当不再需要时,从代码库中删除已弃用的资源和端点会变得更加困难。我知道这可能是主观的,因为不可能有一个简单的正确答案,但我很想了解跨多个版本维护复杂 API 的组织如何解决这个问题。

0 投票
2 回答
177 浏览

java - 管理 Android 版本:为每个版本使用不同的类

我在我的主要活动中使用这个类:

在 ArrayList 中:

我遇到的问题是 MediaSession 是属于 Android API 版本 21 的类,我正在尝试从版本 14 开始制作应用程序。

我希望活动(或类)在版本<21时忽略包含MediaSession类的字段。我遇到的第一个想法是使用抽象类并在版本> = 21时扩展它,但是我将不得不声明不同的 ArrayList,我不确定我该怎么做。也许这不是最好的方法......

有任何想法吗...?

感谢您的意见

0 投票
1 回答
100 浏览

ruby-on-rails - 带有自动生成文档的 Rails API 构建器

我一直想知道是否有任何 gem 可以为 Rails 应用程序生成 API 文档,不仅包含版本控制和输入参数,还包含返回参数的文档。谢谢!

0 投票
1 回答
4627 浏览

.net - MVC6 的 VersionedRoute 属性实现

我正在尝试在 REST API 上启用版本控制,其中版本在标头中指定为"api-version":2.

根据本教程,我只需要创建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

用法是将[VersionedRoute("api/controllerName", 2)]属性应用于为特定版本(例如本例中的版本 2)设计的控制器。

这一切都很好,但不幸的是,这一切都在 MVC5 中,而我正在使用 MVC6。因此,RouteFactoryAttribute并且IHttpRouteConstraint不工作。

我设法找到IRouteConstraint了替换IHttpRouteConstraint(希望它会起作用),但我找不到RouteFactoryAttribute.

如果有人可以使用 MVC 6 提供此示例,或者至少提及我需要继承的正确类(理想情况下带有命名空间)?

0 投票
1 回答
607 浏览

asp.net - 带有 IHttpControllerSelector 的 AttributeRouting - Api 版本控制

我正在尝试在 asp.net webapi 上使用 CustomHttpControlSelector 和 AttributeRouting 来实现 api 版本控制。

我想要做的是通过它的命名空间来区分控制器的版本。

如果向 /api/v2/foo/bar 发出请求,我希望它匹配

但是正如我所见,当我不在 RoutePrefix (/api/v2/foo) 属性路由上使用完整 url 时,路由不会启动,并且当我调用时我得到 null

在我的 CustomHttpControlSelector 上。我不想在每个控制器上重复 /api/v2。

如果我决定删除 attributeRouting 并使用手动路由,例如

我失去了命名控制器和功能的所有灵活性。

有没有办法摆脱这个困境?

注意:对于 CustomHttpControlSelector,我修改了http://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs上的代码

0 投票
1 回答
155 浏览

ruby-on-rails - Rails API 版本控制

我正在尝试以 Railscasts #350 方式(没有 gem)实现 api 版本控制。有没有办法在新版本中只创建更新的资源而不是整个控制器和视图(jbuilder)集,并回退到最新的支持版本功能?我正在使用带有“范围模型:”的接受标头,没有命名空间。谢谢你。

0 投票
1 回答
576 浏览

ruby-on-rails - 设计令牌身份验证和版本控制

我在使用 api 版本实现mount_devise_token_auth_for时遇到问题。
比方说:

如果我想添加 v2 并将身份验证安装在同一路径,如下所示:

它失败了,因为用于设计的命名路由助手已经存在这些名称。
我可以使用命名空间来处理它,但我们不想要 URI 中的版本。
请指教。
谢谢。

0 投票
2 回答
5664 浏览

asp.net-core - 使用动作约束时在 MVC 6 中使用 Swagger 的多个 Api 版本

希望有人尝试过使用 MVC 6 和 Swagger 中的版本化 API 进行类似的操作,以显示有关不同版本的文档。

我根据这个 ASP.NET 5 存储库在 MVC 6 中使用推荐的 API 版本控制。我所做的唯一更改是从请求的自定义 http 标头中读取 api 版本的 GetVersion 方法:

我有一个这样的控制器:

版本控制使用自定义 http 标头进行,以便

获取 /api/标签

内容类型:应用程序/json

默认情况下会触发 GetTags() 操作,因为没有指定标题并且

获取 /api/标签

api版本:2

内容类型:应用程序/json

将点击 GetTagsV2() 动作。

我已经按照此博客中的步骤添加了 Swagger UI 和 Swagger GEN 库,因此在我project.json的依赖项中:

然后在我的 Startup.cs 中,我将 Swagger 添加到管道中

我将 Swagger 配置如下:

问题是我不知道如何从描述(这是 Microsoft.AspNet.Mvc.ApiExplorer.ApiDescription 的一个实例)中获取必要的信息来了解是否必须在 Swagger UI 中显示给定的操作,具体取决于在指定版本上。任何提示将不胜感激。这将有助于理解这个用于版本控制的 ASP.NET 5 存储库实现是如何工作的,因为我仍然不能很好地理解它,也找不到关于操作约束如何工作的好的解释。

PS:这个 stackoverflow 问题帮助我使用 MVC 6 实现版本控制,但我找不到太多关于 Swagger 如何与这种 API 版本控制方式集成的信息。

0 投票
0 回答
1604 浏览

php - 如何使用 Slim 框架支持 API 版本控制

我们一直在使用 Slim 框架为移动应用程序创建 REST API,现在 index.php 位于 web 根目录下的 v1/ 文件夹中。这个 index.php 包含所有的 API。

然而,随着较新版本的移动应用程序需要对相同的 api 端点做出一些稍微不同的响应,我们需要易于扩展的 API 版本控制。我们不想使用不同的文件夹(如 v2、v3、...),每个文件夹都有自己的 index.php。

理想情况下,应该“可能”只有一个 index.php 文件,假设需要添加一个新的 API 版本 vX,它的更改可能只是在一个常见的 API 中,我想要代码更改最小,可能仅限于该 API 功能,并且可能是其他一些地方(为所有其他 API 启用这个新版本)。

是否有一种简单而简短的方法来实现这一点,以便轻松添加新版本?这一般应该怎么做?

编辑1:

以下是解决此问题的“潜在”解决方案,请随时指出其中的问题以及更好的解决方案:

我选择使用条件(应用程序范围的路由条件)来实现这一点:

任何支持 API 版本 1-29 的 API(完全相同的处理)

版本 1-21 和版本 22-29 不同的 API

因此,如果我说有 100 个 API,并且我需要为新版本 30 的 API 更改 3 个 API,那么我可以像上面对 API_B 所做的那样简单地更改这三个 API,并为 apiVersion 更改应用程序范围的路由条件.

0 投票
1 回答
116 浏览

java - 如何解决与 API 版本相关的障碍

我正在享受一项完整的服务,并且有 20 多个客户正在使用这项服务。

现在我决定在服务中引入版本,我有很多谷歌,阅读我的文章但我完全困惑我该怎么办?假设我更改了新服务的 URI,比如@Path("/provider/v1")我应该如何为现有客户提供支持?通过考虑这件事,每当 api 新版本生效时,我是否应该为每个客户端提供更改?

谷歌搜索后,我发现有 3 种方法可以提供版本控制

  1. URL 版本控制

  2. 自定义请求头

  3. 内容类型

但找不到任何实际的例子请在这方面帮助我

http://stackoverflow.com/questions/389169/best-practices-for-api-versioning http://www.narwhl.com/2015/03/the-ultimate-solution-to-versioning-rest-apis-content -协商/ http://restcookbook.com/Basics/versioning/

http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html

http://www.lexicalscope.com/blog/2012/03/12/how-are-rest-apis-versioned/

任何帮助将不胜感激