REST介绍
REST(Representational State Transfer):表述性状态转移,是基于HTTP、URI、MIME(HTML、JSON等)协议的Web软件架构。它不同于SOAP Web服务(RPC)关注处理,面向行为,其更关注要处理的数据,面向资源。
《Spring实战》中是这样描述REST的:
为了理解REST是什么,我们将它的首字母缩写才拆分为不同的构成部分:
- 表述性(Representational):REST资源实际上可以用各种形式来进行表述,包括XML、HTML、JSON及HTML—最适合资源使用者的任意形式。
- 状态(State):当使用REST的时候,我们更关注资源的状态而不是对资源采取的行为。
- 转移(Transfer):REST涉及转移资源数据,它以某种表述性从一个应用转移到另一个应用。
在REST中,资源通过URL进行识别和定位。REST中会有行为,它们是通过HTTP方法来进行定义的。这些HTTP方法通常匹配如下CURD动作:
- Create: POST
- Read: GET
- Update: PUT或PATCH
- Delete: DELETE
wiki是这样描述REST的:
- 资源是由URI来指定。
- 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。
RESTful API:符合REST设计风格的Web API,它从以下三个方面资源进行定义的:
- 直观简短的资源地址:URI,比如:
http://example.com/resources/- 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML,HTML等。
- 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。
应用
HTTP请求方法在RESTful API中的典型应用:
| 资源 | GET | PUT | POST | DELETE |
|---|---|---|---|---|
| 一组资源的URI,比如http://example.com/resources/ | 列出URI,以及该资源组中每个资源的详细信息(后者可选)。 | 使用给定的一组资源替换当前整组资源。 | 在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL。 | 删除整组资源。 |
| 单个资源的URI,比如http://example.com/resources/142 | 获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) | 替换/创建指定的资源。并将其追加到相应的资源组中。 | 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 | 删除指定的元素。 |
实现举例:
列出所有物品:GET http://www.store.com/products
呈现某一件商品: GET http://www.store.com/product/12345
呈现一些商品(过滤规则):GET http://www.store.com/product/1022?limit=10(id为1022后的10件商品)
下单购买:POST http://www.store.com/order <purchase-order> <item> ... </item> </purchase-order>
实现网站
自己找了几个网站看了看,有几个网站个人觉得API挺符合RESTful API:
小米官网:看了几家购物网站,就觉得小米官网除了登录(估计安全原因),其它的设计挺符合RESTful API
落网:一家音乐网站,其推荐的小众音乐挺不错的。因为其功能较为简单,所以其API看起来挺简洁的,一眼看上去就符合RESTful API
私以为
其实自己看了后,感觉不是太懂,模模糊糊的。下面简单说点自己的理解吧:
- 基于RESTful API 能够前后端分离,前端不管是web浏览器还是移动终端只要访问响应的API,就能够得到相应的资源。
- RPC(远程过程化调度)感觉就是基于服务的,更看重行为,一般直接从service层就暴露接口了。而REST上面所说是基于资源的,其一般从web层暴露接口(RESTful API),它更看重对资源的行为(通过HTTP请求方法表现),也就是说我们冲RESTful API中看不出行为来,仅仅能够看出操作资源。
SpringMVC中的REST
大体结构
在一般的SpringMVC框架中处理流程如下:
当HTTP请求到达DispatcherServlet时,DispatcherServlet通过handlerMapping找到该URL对于的Controller后,DispatcherServlet会把HttpServletRequest转发给Controller处理(SpringMVC在这里做了许多的改进)。Controller处理完后会把Model and View传给DispatcherServlet,其会通过ViewResolver找到物理视图,然后把Model发给该视图中进行渲染,最后视图会响应HTTP请求,发送响应的数据。
REST在SpringMVC框架中处理流程如下:
当HTTP请求到达DispatcherServlet时,DispatcherServlet通过handlerMapping找到该URL对于的Controller后,DispatcherServlet会把HttpServletRequest转发给Controller处理(SpringMVC在这里做了许多的改进)在这里时,SpringMVC会通过消息转化器(Message Conversion)@RequestBody、@RequestMapping、@PathVariable接受响应的资源,GET、POST等方法标注行为。然后Controller调用service处理相关资源行为,最后在通过Message Conversion(@ResponseBody)返回数据。
支持的构件
SpringMVC在Controller中有许多的构件支持REST:
- HTTP方法构件。在@RequestMapping()参数中可以通过method=RequestMethod.GET 来指定响应的方法。
- 在@RequestMapping()参数中可以通过produces={“application/json;charset=UTF-8”} 来响应HTTP请求中的Accept字段,如果Request中Accept不支持该字段,则会返回HTTP 406 (Not Acceptable)响应。
- 在@RequestMapping()参数中可以通过consumes={“application/json”} 来响应请求中的Content-Type字段,如果Request中Content-Type不支持该字段,则会返回HTTP 415 ( Unsupported Media Type)响应。
- 获得数据构件。@ReqeustParam()可以获取Query String Parameters、Form Data等,@PathVariable()可以获取路径变量。
- 消息转换器(Message Conversion)转换消息。通过@RequestBody()可以把请求数据通过相关类库(如Jackson)转换Java对象,通过@ResponseBody()可以把Java对象数据通过相关类库(如Jackson)转换为Json对象。
- 可以在类级别使用@RestController。该类的所有方法都会默认的使用消息转化器,相当于每个方法都有@ResponseBody()注解。
使用
导入Jackson:
1 | <dependency> |
Controller:
1 |
|
js:
1 | function login(){ |
HTTP请求和响应
1 | POST /springMVC/hello HTTP/1.1\r\n |