实现版本与WCF或ASP.Net网络API一个RESTful API(Implementing ve

2019-09-17 05:40发布

假设我已经读了很多关于版本一个RESTful API,因此我决定不通过URI版本的服务,但使用mediatypes(格式和架构在请求接受头):

什么是执行WCF服务或Web API服务,以服务于接受的URI定义所请求的资源,格式(如应用程序/ JSON)和架构/版本(例如玩家-V2)请求的最佳方式头?

WCF允许我基于URI路径,但不是基于头。 所以我不能正确路由。

网页API可以让我定义自定义mediatypeformatters,路由请求的格式,而不是架构(例如,返回类型PlayerV1或PlayerV2)。

我想实现一个服务(或者与WCF或Web API)其中,此请求(伪代码):

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

返回PlayerV1实体,JSON格式

与此请求:

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

返回PlayerV2实体,JSON格式。

关于如何实现这个任何提示?

编辑 :为了澄清我为什么要使用内容协商来处理的版本,在这里看到: REST API设计:将“类型”,在“内容类型” 。

Answer 1:

你正在把这里不看我的版本,但它是更多的内容协商。 接受头表示对资源的格式客户的愿望。 服务器应授予愿望还是回到406。因此,如果我们需要更多的合同的概念(尽管Web API unline RPC没有定义),然后使用资源是比较扎实的。

对版本控制的最佳实践还没有充分讨论,但大多数REST爱好者相信在网址中使用的版本是要走的路 (如http://server/api/1.0.3/... )。 这在你的做法也让我更有意义,因为使用内容协商服务器,以保持向后兼容性,我只能想象在服务器上的代码就会变得越来越复杂。 使用URL的方式,你可以一刀两断:老客户能愉快地使用以前的,而新客户可享受新的API带来的好处。


UPDATE

OK,现在的问题已经改为“以RESTful AP实现内容协商”。

类型1:控制器,健忘

基本上,如果内容协商涉及到资源的唯一格式,实施或使用正确的媒体类型格式化就足够了。 例如,如果内容协商涉及返回JSON或XML。 在这种情况下, 控制器是健忘的内容进行谈判。

类型2:控制器感知

控制器需要知道请求协商。 在这种情况下,需要从该请求中提取,并通过在作为参数从请求参数。 例如,假设一个控制器上这个动作:

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

在这种情况下,我会用经典的MVC样式值提供商(参见Brad Wilson的职位上ValueProviders -这是对MVC的Web,但API的价值提供类似于):

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


文章来源: Implementing versioning a RESTful API with WCF or ASP.Net Web Api