数据为王。
数据是许多业务的生命之血。软件通常是可以替换的,但是多年累积的数据是永远不能替换的。
近年来,以信息为中心的表述性状态转移(Representational State Tranfer,REST)已成为替换传统SOAP Web服务的流行方案。SOAP一般会关注行为和处理,而 REST关注的是要处理的数据。
16.1 了解 REST
在软件开发中有一种很流行的做法,那就是推动REST替换SOAP Web服务的时候,会谈论到SOAP的不足。
诚然,对于许多应用程序而言,使用SOAP可能会大材小用了,而REST提供了一种更简单的可选方案。另外,很多的现代化应用都会有移动或富JavaScript客户端,它们都会使用运行在服务器上REST API。
问题在于并不是每个人都清楚REST到底是什么。结果就出现了许多的误解。有很多打着REST幌子的事情其实并不符合REST真正的本意。
16.1.1 REST的基本知识
当谈论REST时,有一种常见的错误就是将其视为”基于URL的Web服务“ —— 将REST作为另一种类型的远程过程调用(remote procedure call,RPC)机制。就像SOAP一样,只不过是通过简单的HTTP URL来触发,而不是使用SOAP大量的XML命名空间。
恰好相反,REST和RPC几乎没有任何关系,RPC是面向服务的,并关注于行为和动作;而REST是面向资源的,强调描述应用程序的事物和名词。
REST的一个限制是它必须是无状态的。
如果您有会话,那么您已拥有状态,因此您无法将服务称为RESTful。
REST
- 表述性(Representational):REST资源实际上可以用各种形式来表述,包括XML、JSON甚至HMTL。
- 状态(State):更应该关注资源的状态而不是对资源采取的行为。
- 转移(Transfer):REST涉及到转移资源数据,它以某种表述性形式从一个应用转移到另一个应用。
REST 就是将资源的状态以最合适客户端或服务端的形式从服务器端转移到客户端(或者反过来)。
在REST中,资源通过URL进行识别和定位。至于RESTful URL的结构没有严格的规则,但是URL应该能够识别资源,而不是简单的发一条命令到服务器上。再次强调,关注的核心是事物,而不是行为。
HTTP方法通常会匹配如下的CRUD动作:
- create: post
- read: get
- update: put或patch
- delete: delete
这并不是严格的限制。
示例解释 REST 和 RPC 的区别
请考虑以下HTTP API示例,该API用于对放置在餐馆中的订单进行建模。
RPC API以“动词”的形式思考,将餐厅功能公开为接受参数的函数调用,并通过似乎最合适的HTTP动词调用这些函数 - 查询的“获取”等等,但名称动词的内容纯粹是偶然的,并且与实际功能没有实际关系,因为您每次都在调用不同的URL。退货代码是手工编码的,也是服务合同的一部分。
相反,REST API将问题域中的各种实体建模为资源,并使用HTTP谓词来表示针对这些资源的事务 - POST创建,PUT更新和GET读取。在同一URL上调用的所有这些动词都提供不同的功能。常见的HTTP返回码用于传达请求的状态。
正在下单:
RPC:http:// MyRestaurant:8080 / Orders / PlaceOrder(POST:{Tacos object})
REST:http:// MyRestaurant:8080 / Orders / Order?OrderNumber = asdf(POST:{Tacos object})
检索订单:
RPC:http:// MyRestaurant:8080 / Orders / GetOrder?OrderNumber = asdf(GET)
REST:http:// MyRestaurant:8080 / Orders / Order?OrderNumber = asdf(GET)
更新订单:
RPC:http:// MyRestaurant:8080 / Orders / UpdateOrder(PUT:{Pineapple Tacos object})
REST:http:// MyRestaurant:8080 / Orders / Order?OrderNumber = asdf(PUT:{Pineapple Tacos object})
示例来自sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc
16.1.2 Spring是如何支持REST的
- 控制器可以处理所有的HTTP方法,包含四个主要的REST方法:get put delete post,Spring 3.2以上还支持 patch方法。
- 借助 @PathVariable 注解,控制器能够处理参数化的URL(将变量输入作为URL的一部分)。
- 借助Spring的视图和视图解析器,能够将资源以多种方式进行表述,包括将模型数据渲染为XML、JSON、Atom以及RSS的View实现
- 可以使用ContentNegotiatingViewResolver来选择最适合客户端的表述
- 借助@ResponseBody 注解和各种HttpMethodConverter实现,能够替换基于视图的渲染方式。
- 借助 @ResponseBody注解和各种HttpMethodConverter实现可以将传入的HTTP数据转化为传入控制器处理方法的Java对象。
- 借助RestTemplate,Spring应用能够方便地使用REST资源。