在REST服务调用中指定版本的最佳方法

在REST服务调用中指定版本的最佳方法,rest,versioning,auto-versioning,Rest,Versioning,Auto Versioning,可能重复: 我目前正在编写一个REST服务,我想了解一下我的客户在发出请求时如何指定服务版本 例如,当我将REST服务器升级到版本2时,我不希望所有实现了我的服务版本1的客户端的调用都中断 我见过其他人在url中添加版本,或者在标题的某个地方指定版本 可能没有一个“最佳”的方法来实现这一点,但我希望能对这一主题有一些想法(赞成者和反对者等) 谢谢我们通过不同的路线完成: http://my.service.com/v1/user/1 http://my.service.com/v2/us

可能重复:

我目前正在编写一个REST服务,我想了解一下我的客户在发出请求时如何指定服务版本

例如,当我将REST服务器升级到版本2时,我不希望所有实现了我的服务版本1的客户端的调用都中断

我见过其他人在url中添加版本,或者在标题的某个地方指定版本

可能没有一个“最佳”的方法来实现这一点,但我希望能对这一主题有一些想法(赞成者和反对者等)


谢谢

我们通过不同的路线完成:

 http://my.service.com/v1/user/1

 http://my.service.com/v2/user/1
在版本之间没有变化的情况下,我们只是将路由映射到为资源的v1版本提供服务的控制器

是的,这确实为同一个资源创建了多个URL,而不稳定的核心REST EvaginList将开始哭泣,但这种方式使您和您的用户易于管理。我发现用户甚至不能使用请求头来设置内容类型,也不能使用X路径之类的东西来处理版本控制

如果确实要避免重复资源问题,可以使用类似get Parameter的版本:

 http://my.service.com/user/1?version=1
如果没有版本,则默认为which。这实际上完全是REST教条,但我认为这会给API用户带来很多麻烦


如果您有办法将用户或api密钥映射到版本,您可以使用某种用户查找表在版本之间进行路由,但这是一种相当疯狂的开销。

我们通过单独的路由进行路由:

 http://my.service.com/v1/user/1

 http://my.service.com/v2/user/1
在版本之间没有变化的情况下,我们只是将路由映射到为资源的v1版本提供服务的控制器

是的,这确实为同一个资源创建了多个URL,而不稳定的核心REST EvaginList将开始哭泣,但这种方式使您和您的用户易于管理。我发现用户甚至不能使用请求头来设置内容类型,也不能使用X路径之类的东西来处理版本控制

如果确实要避免重复资源问题,可以使用类似get Parameter的版本:

 http://my.service.com/user/1?version=1
如果没有版本,则默认为which。这实际上完全是REST教条,但我认为这会给API用户带来很多麻烦


如果您有办法将用户或api键映射到版本,您可以使用某种类型的用户查找表在版本之间进行路由,但这是非常昂贵的开销。

我建议通过Accept/Content-Type头进行版本控制。URI不应该跨版本更改,除非资源本身发生了重大的结构更改。这里有一个很好的解释:

我建议通过Accept/Content-Type头进行版本控制。URI不应该跨版本更改,除非资源本身发生了重大的结构更改。这里有一个很好的解释:

这个解决方案很好,因为它允许在不同版本中使用不同的URL模式。如果要使用像
version=1
这样的URL参数,则API版本之间的路径必须相同。@JasonWyatt查看我对URL参数的编辑。希望您的资源位置不会因软件版本的不同而发生显著变化。。。这是创建用户API时要避免的最重要的事情之一。我知道他们是这样做的,我知道v1,v2是一个变化,但是资源路径的其余部分希望保持不变。我认为用户在准备使用你的新版本时可以将v1改为v2。@JasonWyatt同样,在一段时间让旧api去润滑后,你可以将旧的v1改为v2。现在我认为这是最“实用”的方法。我并不完全赞成接受类型的版本控制。这个解决方案很好,因为它允许在不同的版本中使用不同的URL模式。如果要使用像
version=1
这样的URL参数,则API版本之间的路径必须相同。@JasonWyatt查看我对URL参数的编辑。希望您的资源位置不会因软件版本的不同而发生显著变化。。。这是创建用户API时要避免的最重要的事情之一。我知道他们是这样做的,我知道v1,v2是一个变化,但是资源路径的其余部分希望保持不变。我认为用户在准备使用你的新版本时可以将v1改为v2。@JasonWyatt同样,在一段时间让旧api去润滑后,你可以将旧的v1改为v2。现在我认为这是最“实用”的方法。我并不完全相信接受类型的版本控制。你读过这个吗?对这个主题有很好的概述,还有一些有用的链接-。这听起来是个坏主意,你不应该像这样修改已经存在的功能(因此使用版本)。当创建公共服务/api/不管你怎么称呼它时,你只有一次机会把它做好!你读过这个吗?对这个主题有很好的概述,还有一些有用的链接-。这听起来是个坏主意,你不应该像这样修改已经存在的功能(因此使用版本)。当创建公共服务/api/不管你怎么称呼它时,你只有一次机会把它做好!当客户机指定accept头来告诉服务器他喜欢的响应格式时,我认为这是有意义的。但是,如果特定的服务调用没有响应,或者响应为200,并带有“成功更新”。。在这里,在url中执行版本是有意义的。与其在这两个地方都进行版本控制,我认为保持简单并对url进行版本控制是有意义的。由于客户端指定accept标头来告诉服务器他希望响应采用什么格式,我认为这是有意义的。但是,如果特定的服务调用没有响应,或者响应为200,并带有“成功更新”。。在这里,在url中执行版本是有意义的。而不是做t