RESTful编程到底是什么?


当前回答

剩下的一点是,如果我们同意对基本操作使用通用语言(http动词),那么可以配置基础结构来理解它们并适当地优化它们,例如,通过使用缓存头在所有级别实现缓存。

通过正确实现的restful GET操作,信息来自服务器的DB、服务器的memcache、CDN、代理的缓存、浏览器的缓存或浏览器的本地存储都无关紧要。可以使用最快、最容易获得的最新来源。

说Rest只是语法上的改变,从使用带有动作参数的GET请求到使用可用的http动词,这看起来没有任何好处,而且纯粹是修饰。重点是使用一种可以被链的每个部分理解和优化的语言。如果GET操作有副作用,则必须跳过所有HTTP缓存,否则结果将不一致。

其他回答

如果我不得不将关于REST的原始论文缩减为短短的3句话,我认为以下内容抓住了它的精髓:

通过URL请求资源。协议仅限于使用URL进行通信的内容。元数据作为名称-值对(发布数据和查询字符串参数)传递。

之后,很容易陷入关于适应、编码约定和最佳实践的争论。

有趣的是,本文中没有提到HTTPPOST、GET、DELETE或PUT操作。这一定是后来有人对“统一界面”的“最佳实践”的解释。

当涉及到web服务时,我们似乎需要一些方法来区分WSDL和基于SOAP的体系结构,这会给接口增加相当大的开销和不必要的复杂性。它们还需要额外的框架和开发人员工具才能实现。我不确定REST是否是区分常识接口和过度工程化接口(如WSDL和SOAP)的最佳术语。但我们需要一些东西。

Edit

阅读这里的自述文件,我希望你真的能得到REST。

https://github.com/lukepuplett/surfdude-csharp/blob/master/README.md

--

这些给出链接资源示例的答案很好,但只占一半。

所以,想象你正在设计一个网站。你写一个故事,

我希望能够通过邮政编码搜索地址,以便选择发货地址

然后,您将构建网站,让用户踏上旅程,并尝试在工作流中将页面链接在一起。

一个网站设计让他们进行地址查找,然后让他们将地址复制到剪贴板,然后返回到发货地址表单,这是不太有用的。

REST API使用我们在web上认为理所当然的模式进行机器-机器交互。

对邮政编码功能的搜索不应该是base/addresss/{postcode},并且会返回一个集合,即使每个地址都链接到一个完整的地址和一些编辑链接,因为这是一个死胡同;API使用者需要猜测如何使用该地址。

相反,该功能的动机应内置于其使用的流程中,以便旅程在开始时结束:

1 GET /orders/123/shipping

  200 OK { Current shipping details + link to parent + link to address picker }

2  -> GET /orders/123/shipping/addresspicker

      200 OK { Link and form for searching for a postcode }

3   -> GET /orders/123/shipping/addresspicker?postcode=tn11tl

       200 OK { List of addresses each with link to pick it }

4    -> POST /orders/123/shipping/addresspicker?postcode=tn11tl&pickNo=3

        200 OK { Current shipping details + link to parent + link to address picker }

这是一次用户旅程,最后您可以看到流量对订单的影响。

HTTP请求/响应严格来说不是REST的一部分,但我认为没有人见过非HTTP REST应用程序。

现在这些URL可以是任何一组字符,它们只是标识符,我把它们做得很漂亮,因为它们对人们来说很有意义。机器将使用rel来计算它们做什么,而不依赖于可读的href。

一种称为REST(RepresentationalStateTransfer)的体系结构风格主张web应用程序应该像最初设想的那样使用HTTP。查找应使用GET请求。PUT、POST和DELETE请求应分别用于变异、创建和删除。

REST支持者倾向于使用URL,例如

http://myserver.com/catalog/item/1729

但REST架构不需要这些“漂亮的URL”。带有参数的GET请求

http://myserver.com/catalog?item=1729

完全是RESTful的。

请记住,GET请求不应用于更新信息。例如,向购物车添加项目的GET请求

http://myserver.com/addToCart?cart=314159&item=1729

这是不合适的。GET请求应该是幂等的。也就是说,发出两次请求与发出一次请求应该没有区别。这就是请求可缓存的原因。一个“添加到购物车”请求不是幂等的,发出两次请求会向购物车添加两个项目副本。POST请求显然适合于这种情况。因此,即使是RESTful web应用程序也需要共享POST请求。

这摘自大卫·M·Geary的优秀著作《核心JavaServer面孔》。

交谈不仅仅是交换信息。协议实际上是这样设计的,因此不必进行对话。每一方都知道他们的具体工作是什么,因为它在协议中有所规定。协议允许纯粹的信息交换,而不需要对可能的操作进行任何更改。另一方面,谈话允许一方询问另一方可以采取什么进一步行动。他们甚至可以问同一个问题两次,并得到两个不同的答案,因为另一方的状态可能在这期间发生了变化。对话是RESTful架构。菲尔丁的论文规定了如果一个人想让机器彼此交谈而不是简单地通信,那么他必须遵循的体系结构。

REST定义了6个体系结构约束,使任何web服务都成为真正的RESTful API。

统一接口客户端-服务器无国籍的可缓存的分层系统按需编码(可选)

https://restfulapi.net/rest-architectural-constraints/