2009-10-08 68 views
11

由于找不到chuffing工作,我一直在阅读ReST和创建Web服务。我已经解释了它的方式,未来就是在构建Web应用程序之前为您的所有数据创建Web服务。这似乎是一个好主意。ReSTful URLS的标准是什么?

然而,似乎有很多矛盾的想法是什么最好的方案是ReSTful网址。

有人主张简单漂亮的URL

http://api.myapp.com/resource/1 

此外,有些人喜欢在API版本添加到URL,像这样

http://api.myapp.com/v1/resource/1

使事情更加混乱,有人主张增加内容类型来获取请求

http://api.myapp.com/v1/resource/1.xml 
http://api.myapp.com/v1/resource/1.json 
http://api.myapp.com/v1/resource/1.txt 

而其他人认为内容类型应该在HTTP标头中发送。

Soooooooo ....这是很多变化,这让我不确定什么是最好的URL方案。我个人认为包含版本号,资源定位器和内容类型的最全面的URL的优点,但我是新手,所以我可能是错的。

另一方面,你可能会认为你应该做“最适合你的任何事情”。但据我所知,这并不符合ReST的思路,因为其目标是制定一个标准。

而且由于很多人会有比我更多的经验,所以我想请教一些指导。因此,考虑到这一切...

ReSTful URLS的标准是什么?

+1

考虑修复标题。 “最好”并不意味着什么。而且你的问题比一个模糊的挥手更具体。动词和响应格式有两个具体问题。请修正您的问题标题,以清楚地反映您的实际问题。 – 2009-10-08 11:17:08

回答

9

欢迎来到什么是和什么不是REST的混淆世界。首先,我会建议你在错误的地方阅读了关于REST的内容。尝试RESTWiki是一个很好的起点。

REST不是为您的Web应用程序提供数据服务的绝佳解决方案。 “Web服务”(又称SOAP,XML-RPC,WSDL,HTTP-POX)可能会有所帮助,但REST架构风格更倾向于客户端 - 服务器场景而不是服务器服务器场景。

不要再考虑网址的样子。他们看起来像使用哪个服务器端框架来实现RESTful服务,而不是服务本身的设计。客户端应该从以前检索的表示中发现URL,因此它并不关心URL的外观。

话虽如此,使用您的示例网址来尝试和区分你认为应该是不同的资源,我还有一些其他的建议。

不要版本资源。即如果您有一个资源被url http://example.org/TodaysWeather访问,请不要在http://example.org/V2/TodaysWeather创建资源。有很多其他更好的方式来表示版本,而不是创建一个全新的资源。搜索大量的其他讨论。至于为不同的内容类型创建不同的资源,我认为这是一个上下文特定的决定。如果您的最终用户使用浏览器访问REST服务,并且它们足够复杂以了解JSON和XML之间的差异,那么请继续并创建两个资源。如果它是一台机器客户端,那么我会使用内容协商来获得所需的格式。

最后,要小心,因为REST成为流行语,因为周围存在的错误信息远多于有效内容。

+0

我认为,其中很多都是主观的。在语义上,不明确地版本化特定资源是有意义的,除非这是业务问题的实际部分(即,我想查看两年前我的InsuranceCoverage资源,而不是现在)。但是我会提出,在URL的开头部分推出“v1”使得它明确说明您正在与之交谈的API的版本。你也可以想象服务器的代码是如何整洁的 - 当创建V2时,V1代码不会受到影响,因为这些代码都是新类,不需要在请求的Version标头中插入switch语句。 – 2009-10-08 12:55:32

+0

当大多数人谈论版本控制时,他们并不是指“业务相关”版本。你说得对,如果它与业务相关,那么把它变成另一种资源是有道理的。 当您正确使用超媒体并且只有部分API需要新版本时,向URI添加版本会非常麻烦。现在您可以使用指向来自V1 api的资源的V2 urls访问这些表示。 – 2009-10-08 13:42:25

+0

至于在服务器端进行整理,版本控制媒体类型可以很容易分开。通常,已经存在一种机制来“切换”内容类型,因此向内容类型添加版本只是重用该机制来提供正确的版本。 – 2009-10-08 13:43:08

3

动词不能放入URL中。这是没有意义的。它已经在请求标题中。当你发送一个在URL中有GET的POST请求时,这太疯狂了。

响应格式通常最好放入URL中,因为标题不提供简单明确的地方放置该信息。

+0

你是对的,我误解了这篇文章,并把它作为面值http://microformats.org/wiki/rest/urls – gargantuan 2009-10-08 11:18:09

+0

对于你的第二句话,“响应格式通常是最好的放入URL,因为标题不要提供一个简单明了的地方来提供这些信息。“ - 当然他们做!接受就是这样,并得到很好的支持。 – 2012-12-05 11:45:37

3

我与S.Lott - Verb *不应该在那里,因为您想使用相同的URL来读取记录,并更新它以使其符合REST要求。

内容类型是别的东西,因为它是相同的记录,但具有多种编码格式。 (阅读FRBR的方式比您想要了解的区别问题更多)。可以使用HTTP Accept标头处理决定发送哪个版本的响应。

唯一一个我讨厌的是版本号,因为我个人不会想到一个合适的HTTP头来处理它的方面。 (预计接受编码Pragma可能甚至是升级,但出于兼容性的原因,你会更经常地想降级到较旧的版本,我想)我可能会有一个版本较少的访问器,它提供了最新的生产版本,但可能会考虑有一个版本不适合向后兼容的重大更改。

更新:版本问题可能取决于您对连接到您的服务的客户端有多少控制权......如果你有从广泛的公众(我不这样做)访问,你可能更感兴趣的是向后兼容性。根据所做的更改,您可能会认为'版本2'是一种全新的资源,而不仅仅是原始版本的新版本。

+0

将不会有一个可选的版本号使mod_rewrite和路由更困难?此外,通过在那里安装版本号,人们可以更轻松地升级和降级,只需在引导区中安装所需的api版本,而不必手动更改每个请求。 – gargantuan 2009-10-08 11:51:00

+1

如果希望服务器能够提供两种不同版本的表示形式,则内容类型是您将使用的标题。例如应用程序/ vnd.twitter。statusesV1 + xml和application/vnd.twitter.statusesV2 + xml使用此方法,客户端可以请求他们理解的版本,并且可以在不中断客户端的情况下引入新版本。显然,媒体类型的设计首先应该尽可能具有变化的灵活性,并且引入新的版本号应该是最后的手段,因为它会打破旧客户端。 – 2009-10-08 12:53:24

+1

Darrel - HTTP'Accept'头部是客户端用来指定他们愿意消费什么类型的东西,然后服务器会响应(设置适当的内容类型)或状态406(不可接受) – Joe 2009-10-08 16:15:19

3

版本控制:我通常在您的示例url中看到了它的位置,如果没有指定版本,您应该使用最新的生产版本进行响应。一个考虑因素是是否将API版本放在您的响应字符串中以用于客户端调试目的。

响应格式:返回格式应在用户代理发送的HTTP Accept报头中指定。

请求字符串中的动词:绝对不是。

+0

是否有可用性的争论。如果通过浏览器访问服务,则URL是用户界面的一部分。所以,虽然它应该在HTTP Accept头中,但也可以通过在url中使用它。 – gargantuan 2009-10-08 11:38:31

+0

在这种情况下,我认为真正的可用性问题出现在接受标头中的JSON和URL中的XML中。 – Nicholas 2009-10-08 11:57:22

+0

如果你正在使用一个较老的API并添加一个新版本(其中没有指定版本参数),那么我会建议,如果没有收到版本参数的请求被接收到,你会使用最旧版本的API而不是最新的;否则,你会打破旧客户。如果这种“最近期”行为是从API的V1开始指定的,那么它会没事的。我的两分钱。 – 2009-10-10 13:42:22