对ASP.NET MVC应用程序的REST API进行版本控制

本文关键字:API 版本控制 REST ASP NET MVC 应用程序 | 更新日期: 2023-09-27 18:23:43

我正在考虑在ASP.NET MVC 3中开发一个应用程序,同时希望提供一个公共的API。

环顾四周,似乎有两种方法可以实现这一点。要么创建一个API区域,并让控制器返回json/xml。或者使用操作过滤器和一组前端控制器,并根据请求头返回json/xml/html。

我想稍后再做,但我想知道如果你走这条路,你怎么能对你的api进行版本控制?

如果你走第一条路,你可以很容易地创建一个v1/v2控制器,但如果你做后面的路,你怎么能版本它?

对ASP.NET MVC应用程序的REST API进行版本控制

版本控制一开始是一个相当复杂的问题。以下是我以前看的方法:

  1. URL。在这种情况下https://api.example.com/v1/projects被假定为与http://api.example.com/v2/projects,尽管事实并非如此。Basecamp似乎就是这么做的。按照这种方法,假设您必须始终支持旧的API
  2. 标题。URL保持不变,但是,客户端会传递一个额外的HTTP头,比如X-MYAPI-VERSION,每个请求都带有一个标识要使用的API版本的值。谷歌文档列表API就是这样做的。这种方法的一个潜在问题是,客户端和服务器之间的中介可能会剥离HTTP标头
  3. 参数。为了避免选项2的问题,您可以传递API版本以用作参数(例如https://api.example.com/projects?v=3)
  4. 媒体类型。在这里,URL保持不变,但是,用户需要使用accept和content-type头指定资源的表示形式。例如,一个"项目"可以使用"application/vnd.mycompany.resource[-version][+format]"来表示,为v1 json提供"application/vnd.mycompany.project-v1+json"的表示,或为v1 xml提供"application/vnd.mycocompany.project-v1+xml"的表示。当你需要一个新版本的项目时,mime类型可能看起来如下"application/vnd.mycompany.project-v2+xml"。Github似乎支持这一点
  5. 有效载荷的一部分。在这种情况下,请求的有效负载包含要使用的版本号。例如,当传递XML时,可以查看名称空间以确定正在使用哪个版本的API。对于JSON,可以使用"$version"或"_version"属性来指定版本
  6. 客户端密钥。注册应用程序时,它会指定要使用的API版本。当您对客户端进行身份验证时,您要确保模拟它想要使用的版本
  7. 没有明确的版本控制始终可以选择不对API进行版本控制,并通过使所有字段可选来尝试透明地处理更改,并在缺少字段时适当地处理这些更改。无论如何,您都有可能这样做,以使API的未来版本与您当前开发的版本兼容

许多人建议选择4,尽管它并不总是实用的。这些选项中的大多数都需要额外的工作才能使用ASP.NET MVC。

您可以使用两个路由中的一个-您可以在路由中包含API(而不是http://app.lication/category/1,您可以使用类似http://app.lication/api/v1/category/1的内容),也可以包含自定义HTTP头。

任何一种都可以让你区分被调用的版本。