分类 标签 存档 程序员漫画 黑壳相关站点 订阅 搜索

什么是 REST 以及 RESTful?

798 浏览

本文由黑壳博客转载

本文来源 什么是 REST 以及 RESTful??

壳叔搞笑时间

imagepng

正文

介绍

自从 Roy Fielding 博士在 2000 年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST 就基本上迅速取代了复杂而笨重的 SOAP,成为 Web API 的标准了。

什么是 Web API 呢?

如果我们想要获取某个电商网站的某个商品,输入http://localhost:9999/products/123,就可以看到 id 为 123 的商品页面,但这个结果是 HTML 页面,它同时混合包含了 Product 的数据和 Product 的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从 HTML 中解析出 Product 的数据。

如果一个 URL 返回的不是 HTML,而是机器能直接解析的数据,这个 URL 就可以看成是一个 Web API。比如,读取http://localhost:9999/api/products/123,如果能直接返回 Product 的数据,那么机器就可以直接读取。

REST 就是一种设计 API 的模式。最常用的数据格式是 JSON。由于 JSON 能直接被 JavaScript 读取,所以,以 JSON 格式编写的 REST 风格的 API 具有简单、易读、易用的特点。

编写 API 有什么好处呢?由于 API 就是把 Web App 的功能全部封装了,所以,通过 API 操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。

此外,如果我们把前端页面看作是一种用于展示的客户端,那么 API 就是为客户端提供数据、操作数据的接口。这种设计可以获得极高的扩展性。例如,当用户需要在手机上购买商品时,只需要开发针对 iOS 和 Android 的两个客户端,通过客户端访问 API,就可以完成通过浏览器页面提供的功能,而后端代码基本无需改动。

当一个 Web 应用以 API 的形式对外提供功能时,整个应用的结构就扩展为:

REST-arch

把网页视为一种客户端,是 REST 架构可扩展的一个关键。

Rest 架构的主要原则

网络上的所有事物都被抽象为资源

每个资源都有一个唯一的资源标识符

同一个资源具有多种表现形式 (xml,json 等)

对资源的各种操作不会改变资源标识符

所有的操作都是无状态的

符合 REST 原则的架构方式即可称为 RESTful

REST 主要对以下两方面进行了规范

- 定位资源的 URL 风格,例如

http://bhusk.com/admin/1234

http://bhusk.com/admin/1234/10/11

- 如何对资源操作

采用 HTTP 协议规定的 GET、POST、PUT、DELETE 动作处理资源的增删该查操作

什么是 Restful:

对应的中文是 rest 式的; Restful web service 是一种常见的 rest 的应用, 是遵守了 rest 风格的 web 服务; rest 式的 web 服务是一种 ROA(The Resource-Oriented Architecture)(面向资源的架构).

符合 REST 约束风格和原则的应用程序或设计就是 RESTful.

/emp/1  HTTP GET      查询id=1的emp

/emp/1  HTTP DELETE    删除id=1的emp,实验中直接删除会报405错误,但是采用$.ajax异步删除就没问题

/emp/1  HTTP PUT    跟新emp

/emp/add  HTTP POST     新增emp

Spring 对 RESTful 的支持

- Spring MVC 对 RESTful 应用提供了以下支持

- 利用 @RequestMapping 指定要处理请求的 URI 模板和 HTTP 请求的动作类型

- 利用 @PathVariable 讲 URI 请求模板中的变量映射到处理方法参数上

- 利用 Ajax, 在客户端发出 PUT、DELETE 动作的请求


 @RequestMapping(value = "/{id}", method = RequestMethod.GET)
 public String toUpdate(@PathVariable("id") Integer id, Model model) {}

RequestMapping 的一般应用格式。

@RequestMapping(value = "/{id}", method = RequestMethod.GET)

@RequestMapping(value = "/{id}", method = RequestMethod.POST)

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)   // 因为这个需要Ajax请求,所有返回的是个json

@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)

客户端发送 PUT,DELETE 请求

可以采用 Ajax 方式发送 PUT 和 DELETE 请求

   $.ajax( {  
           type : "DELETE",  
           url : "/spring_crud_restful/emp/deleteEmp/" + id,  
           dataType : "json",  
           success : function(data) {  
               alert(data);  
               location.href = "/spring_crud_restful/emp/listEmp/1";  
           }  
      });

静态资源访问处理

采用 RESTful 架构后,需要将 web.xml 中控制器拦截的请求设置为 /,这样会将 css,js 等静态资源进行拦截,发送 404 错误。

解决方法:

<mvc:resources/>
<mvc:resources mapping="请求URI" location="资源位置" />
<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>

本篇文章参考了一部分 http://t.cn/RuZZUK3,http://t.cn/RKO0YPr

关于我们

程序员是个辛苦的职业

请善待你们身边的每一位程序员~

欢迎在评论写下你的程序员趣事,程序员不是一个死板的职业~~

欢迎扫描二维码加入我们的小组织 ,大家都叫我壳叔,很期待你的到来。
黑壳网交流群 Q 群:200408242

11a84075a304ac57f6d37323512fd24cde9836350b9d80148b282eeaa188b196c2358d4ffd7006cbpng

黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

评论  
留下你的脚步
推荐阅读