加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用WCF或ASP.Net Web Api实现RESTful API的版本控制

发布时间:2020-12-16 03:21:43 所属栏目:asp.Net 来源:网络整理
导读:假设我已经阅读了很多关于版本化restful api的内容,我决定不通过uri对服务进行版本化,而是使用mediatypes(请求接受头中的格式和模式): 实现wcf服务或web api服务以提供定义uri中所请求资源的请求的最佳方式是什么,格式(例如,application / json)和schema中
假设我已经阅读了很多关于版本化restful api的内容,我决定不通过uri对服务进行版本化,而是使用mediatypes(请求接受头中的格式和模式):

实现wcf服务或web api服务以提供定义uri中所请求资源的请求的最佳方式是什么,格式(例如,application / json)和schema中的schema / version(例如player-v2)头?

WCF允许我基于uri进行路由,但不基于标头.所以我不能正确路由.

Web Api允许我定义自定义mediatype格式,路由所请求的格式,但不是模式(例如,返回类型PlayerV1或PlayerV2).

我想实现一个服务(使用WCF或Web Api),对于此请求(伪代码):

api.myservice.com/players/123 Accept format=application/json; schema=player-v1

以json格式返回PlayerV1实体

并为此请求:

api.myservice.com/players/123 Accept format=application/json; schema=player-v2

以json格式返回PlayerV2实体.

有关如何实现这一点的任何提示?

编辑:澄清我为什么要使用内容协商处理版本,请参见此处:REST API Design: Put the “Type” in “Content-Type”.

解决方法

你带来什么并不是我的版本,但更多的是内容协商. Accept标头表示客户端对资源格式的愿望.服务器应该授予愿望或返回406.因此,如果我们需要更多的契约概念(尽管Web API unline RPC没有定义),那么使用资源更加可靠.

版本控制的最佳实践尚未完全讨论,但大多数REST爱好者认为使用URL中的版本是可行的方法(例如http://server/api/1.0.3 / …).这对我来说也更有意义,因为在你的方法中使用内容协商服务器必须保持向后兼容性,我只能想象服务器上的代码会变得越来越复杂.使用URL方法,您可以彻底解决:旧客户可以愉快地使用以前,而新客户可以享受新API的好处.

UPDATE

好了,现在问题已经改为“在RESTful AP中实现内容协商”.

类型1:控制器 – 忘记

基本上,如果内容协商仅涉及资源的格式,则实现或使用正确的媒体类型格式化器就足够了.例如,如果内容协商涉及返回JSON或XML.在这些情况下,控制器无视内容协商.

类型2:控制器感知

控制器需要知道请求协商.在这种情况下,需要从请求中提取请求中的参数并将其作为参数传入.例如,让我们想象一下控制器上的这个动作:

public Player Get(string schemaVersion)
{
    ...
}

在这种情况下,我会使用经典的MVC样式值提供程序(请参阅Brad Wilson’s post on ValueProviders – 这是在MVC上,但Web API的值提供程序看起来类似):

public Player Get([ValueProvider(typeof(RequestHeadersSchemaValueProviderFactory))]string schemaVersion)
{
    ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读