做REST的正确方法是什么?


36

如今,每个人都在进行SOA,即使有些人实际上并不了解全部内容。所以他们做错了。以此为类比,我知道REST是什么(或者至少我认为我是这样做的),并且想要做一些。但是我想做对。

所以我的问题是做REST的正确方法是什么?


1
在Stack Exchange网络的背景下, Stack Overflow的“ rest”标签Wiki似乎与规范资源非常接近

17
我只是闭上了眼睛……也许去骑自行车然后躺下。
爱德华·

REST基本上不是仅使用mydomain.com/accounts之类的URL和HTTP动词来调用操作吗?动词指示您是否要获取,创建,更新或删除数据?当我想到REST时,我就是这么想的。
松饼人

2
@Nick,这是最常见的解释,“真实的东西”很难理解,而且(据我所知)很难在任何地方找到实际实现的东西……(请参阅Wilk的回答)
Benjol

3
@Nick您的理解不是REST,而是RPC over HTTP

Answers:


30

嗯,有很多方法可以学习如何构建RESTful Web应用程序,没有,没有唯一的正确方法。RESTful不是一个标准,但它使用一组标准(HTTP,URI,Mime Type等)。

从此开始:我如何向我的妻子解释REST

然后,继续进行以下操作:RESTful Web服务食谱

然后,全力以赴开发Web应用程序,因为最好的学习方法是进行实验,并且您可以从错误中学习很多;)

如果您的第一个Web应用程序不会完全基于RESTful,请不要担心:您会找到实现它的方法!

因此,引用Obi-Wan Kenobi的话,“愿力量与您同在!” ;)

编辑

好吧,让我更具体一些。 您想制作一些RESTful Webapp,对吗?好吧,正如我所说的,有很多方法可以做到,但这是主要的指导原则。

定义

REST(表示状态传输)是分布式系统(如WWW)的软件体系结构样式。它不是标准,而是使用一组标准:HTTP,AJAX,HTML,URI,Mime Type等。我们正在谈论的是资源的表示形式,而不是资源本身。取自“我如何向妻子解释REST”:

妻子网页是一种资源吗?

瑞安有点。网页是资源的表示。资源只是概念。

建筑约束

  • 客户端-服务器:客户端和服务器由统一接口(如下所述)分隔。
  • 无状态:无需在服务器上保存特定客户端状态即可完成服务器与客户端的通信。
  • 可缓存的:客户端可能已经缓存了已经做出的请求的响应。
  • 分层系统:客户端不知道客户端是否直接与最终服务器连接,或者是否通过中间件进行通信。

统一界面

  • 资源的标识:每个资源都必须由URI标识。
  • 协议:为了进入通信客户端和服务器,必须先完成协议。每个请求都可能具有正确的MIME类型(application / xml,text / html,application / rdf + xml等),正确的标头和正确的HTTP方法(请参见下面的CRUD描述)。

欺诈

好的,我们看到要标识可以使用URI的资源,但是需要其他一些操作(添加,修改,删除等):非常欢迎CRUD(创建,读取,更新和删除)。

  • 创建 { HTTP:POST } { SQL:INSERT } =>创建新资源
  • 读取 { HTTP:GET } { SQL:SELECT } =>获取资源
  • 更新 { HTTP:PUT } { SQL:UPDATE } =>修改资源
  • 删除 { HTTP:DELETE } { SQL:DELETE } =>删除资源

现在,关于PUT和DELETE,可能会出现一些技术问题(您将使用HTML表单获得它们):通常,开发人员会针对每个“ PUT”和“ DELETE”请求使用POST绕过此问题。正式地,您必须使用PUT和DELETE。顺便说一句,做你想做的。我的经验促使我每次都使用POST和GET。

--- 应该使用下一部分,但它不是REST的约束:它涉及链接数据 ---

URI

技术细节中的抽象URI!告别URI,如下所示:

http://www.example.com/index.php?query=search&id=9823&date=08272012

重新设计URI!使用上面的链接,并进行如下更改:

http://www.example.com/search/2012/08/27/9823

好多了吧?可以通过以下方式完成:

另一件事:使用不同的URI表示不同的资源:

注意:about.html和about.rdf不是文件!它们可能是XSLT转换的结果!

内容协商

如果您到了这一步,恭喜!可能您已经准备好获取更多抽象概念,因为我们正在输入语义Web技术详细信息;)好吧,当您的客户想要资源时,它通常会发出以下请求:

GET http://www.example.com/about
Accept: application/rdf+xml

但是服务器不会使用about.rdf做出响应,因为它具有不同的URI(http://www.example.com/about.rdf)。因此,让我们看一下303模式!服务器将返回以下内容:

303 See Other
Location: http://www.example.com/about.rdf

客户将遵循返回的链接,如下所示:

GET http://www.example.com/about.rdf
Accept: application/rdf+xml

最后,服务器将返回请求的资源:

200 OK
about.rdf

不用担心:您的客户端应用程序不会执行任何操作!303模式必须由服务器应用程序完成,其余的将由您的浏览器完成;)

结论

理论常常与实践相距甚远。是的,现在您知道如何设计和开发RESTful应用程序,但是以上指南只是一个提示。您将找到构建Web应用程序的最佳方法,并且可能与理论上的想法不同。不要给该死的:D!

参考书目

RESTful Web服务,Sameer Tyagi

REST API必须是超文本驱动的,Roy Thomas Fielding

RESTful Web服务:基础知识,Alex Rodriguez

Webber REST工作流程


1
您可能会考虑添加此链接,这是我遇到的最完整的指南。
Benjol 2012年

我已经看到PUT和POST的含义互换了使用(与您的答案有关):POST->创建,PUT->更新。任何想法更广泛地使用哪个意思?
Andres F.

@Andres F .:jcalcote.wordpress.com/2008/10/16/…说:如果您要发送指定资源(URL)的完整内容,则创建= PUT。如果要使用某些服务器端算法向服务器发送命令以创建指定资源的下属,则Create = POST。更新= PUT,如果您要更新指定资源的完整内容。如果您请求服务器更新指定资源的一个或多个下属,则Update = POST。
威尔克

@Benjol:我将根据您的建议进行编辑;)谢谢!
威尔克

1
@Wilk需要考虑很多事情!可能是为什么没人能正确地做到这一点:P
Andres F.

5

REST圣经书或其他内容。

不需要圣经书;我有相同的确切问题,通过阅读以下三篇文章,了解了我需要或想了解的有关REST的所有知识:

  1. Net Tuts + 对HTTP和REST的初学者介绍
  2. RESTful Web服务: IBM developerWorks 的基础知识
  3. 实践中来自InfoQ的RESTful HTTP

但是我想做对。

正如您在上面的文章中所读到的那样,关键是将应用程序中可访问的部分视为可以使用现有HTTP“动词”创建,检索,更新或删除的“资源”:GET,PUT,POST ,删除。

另外,了解PUT和POST之间的区别以及何时使用它们。GET,PUT和DELETE应该是幂等事务,而POST应该不是。

另外,在与客户端通信时,请正确使用HTTP状态代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.