文章概要:
什么是RESTful?
RESTful的规范是什么?
实际开发中RESTful是怎么使用的?
RESTful架构,是目前最流行的一种互联网软件架构,因为其结构清晰,符合标准,易于理解,扩展方便,所以越来越多的网站采用RESTful架构设计了。
其实,RESTful是一种开发理念,是对http很好的诠释。维基百科说:REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。维基百科称其为“具象状态传输”(英文:Representational State Transfer,简称REST),我理解为“表现层状态转化”,是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格。
我们先来具体看下RESTful风格的url,比如我要查询商品信息,那么
非REST的url:http://.../queryGoods?id=1001&type=t01
REST的url: http://.../goods/1001
可以看出REST特点:url简洁,将参数通过url传到服务器,而传统的url比较啰嗦,而且现实中浏览器地址栏会拼接一大串字符,相必你们都见过吧。但是采用REST的风格就会好很多,现在很多的网站已经采用这种风格了,这也是潮流方向,典型的就是url的短化转换。
我认为理解RESTful的核心就是理解Representational State Transfer这三个单词的意思。
具象的,就是指表现层,也就是“资源”,什么是资源呢?网站就是资源共享的东西,客户端(浏览器)访问web服务器,所获取的就叫资源。比如html,txt,json,图片,视频等等。浏览器通过URI确定一个资源,但是如何确定它的具体表现形式呢?应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
状态转换,就是客户端和服务器互动的一个工程,在这个过程中产生了数据的状态的变化叫做状态转换。客户端访问必然使用HTTP协议,HTTP协议实际上含有4个表示操作方式的动词,分别是 GET,POST,PUT,DELETE,他们分别对应四种操作。GET用于获取资源,POST用于新建或者更新资源,PUT用于更新资源,DElETE用于删除资源。GET和POST是表单提交的两种基本方式,比较常见,而PUT和DElETE不太常用。而且HTTP协议是一种无状态协议,这样就必须把所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)
综合上面的解释,RESTful架构就是:
每一个URI代表一种资源;
客户端和服务器之间,传递这种资源的某种表现层;
客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准,汲取了WWW的成功经验:无状态,以资源为中心,充分利用HTTP协议和URI协议,提供统一的接口定义,使得它作为一种设计Web服务的方法而变得流行。在某种意义上,通过强调URI和HTTP等早期Internet标准,REST是对大型应用程序服务器时代之前的Web方式的回归。目前Go对于REST的支持还是很简单的,通过实现自定义的路由规则,我们就可以为不同的method实现不同的handle,这样就实现了REST的架构。
上边说的是标准,但是实际开发中并没有全部实现标准,因为那样会增加开发成本。增加代码复杂度。我们就ssm框架例举一下restful风格的开发方法。
需求:RESTful方式实现商品信息查询,返回json数据
1.添加DispatcherServlet的rest配
//添加spring的servletspringmvc-servlet-restorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring/springmvc.xml//映射路径springmvc-servlet-rest/2.URL 模板模式映射
@RequestMapping("/Items/{id}")
public @ResponseBody Items(@PathVariable("id") String id,Model model) throws Exception{
//方法中使用@PathVariable获取id的值,使用model传回页面
//调用 service查询商品信息
ItemsCustom items = itemsService.findItemsById(id);
return items;
}
解释:@RequestMapping(value="/ Items/{id}"):{×××}占位符,请求的URL可以是“/Items/1”或“/Items/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
如果RequestMapping中表示为"/Items/{id}",id和形参名称一致,@PathVariable不用指定名称。
简单讲就是使用了两个注解@ResponseBody和@PathVariable,@ResponseBody指返回的数据,@PathVariable指传入的参数。@PathVariable将@RequestMapping("/Items/{id}")的占位符id的数据取出,放到形参中,处理完数据用@ResponseBody返回。其中spring框架都给我们定义好了,我们只需要明确指定传入参数是什么,返回 值是什么就行了,而指定方式就是两个注解。是不是很方便?这就大大简化了开发,提高了效率。