什么是REST以及 RESTful?
本文由黑壳博客转载
本文来源 什么是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的形式对外提供功能时,整个应用的结构就扩展为:
[图片上传失败...(image-1e2b60-1546945534985)]
把网页视为一种客户端,是REST架构可扩展的一个关键。
Rest架构的主要原则
** 网络上的所有事物都被抽象为资源**
** 每个资源都有一个唯一的资源标识符**
** 同一个资源具有多种表现形式(xml,json等)**
** 对资源的各种操作不会改变资源标识符**
** 所有的操作都是无状态的**
** 符合REST原则的架构方式即可称为RESTful**
REST主要对以下两方面进行了规范
-定位资源的URL风格,例如
http://bhusk.com/admin/1234/10/11
-如何对资源操作
采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删该查操作
image什么是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