什么是rest?当我看到这个词的时候,我也不知道,我还以为是休息,最后查了一下,做web开发必须要知道rest
好了,就来简单介绍一下rest
rest即Representational State Transfer,表现层状态转化
互联网上资源(是服务)细化理解为一个url,如果访问某个资源通过http url访问。
我们把”资源”具体呈现出来的形式,叫做它的”表现层”(Representation)
表现层对用户展示的形式:html、json、xml、pdf、图片。。
由于http协议的限制,服务器和客户端不能实现主动通信,只能有客户端发起请求服务端响应请求,也就是将请求方法和参数都包含url,
使用rest和不使用rest的规则都是这样做的,但是rest对于url做了很好的规划,这个规则将方法和资源分开看起来做的很简单,但是却使我们更好理解了,上网无非就是对于网络资源的操作,网络资源在internet中直白点说就是url(个人理解)所以如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。
GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源
RESTful就是对http最全面最好的诠释,RESTful就是进行互联网开发的理念、思想。
原始url:http://www……/queryItems.action?type=101&id=111…
规范后:http://wwww…/item/101/1
比如:
对商品查询
url:http://wwww…/item/101/1 表示对101分类 下的1号商品查询
http请求方法设置为get
比如:
对商品删除
url:http://wwww…/item/101/1表示对101分类 下的1号商品删除
http请求方法设置为delete
在请求时指定服务端给客户端响应的内容类型是什么?
实现:在请求时设置http头中Accept
对商品查询,以json格式展示:
rest设置:
url为:http://wwww…/item/101/1
客户端请求此url并且设置Accept为”applicatoin/json”
服务端处理方法:
接收请求,解析Accept,根据指定类型返回不同的内容格式。
如果解析到Accept为”applicatoin/json”,服务端就将内容转成json输出
如果解析到Accept为”applicatoin/xml”,服务端就将内容转成xml输出
综合上面的解释,我们总结一下什么是RESTful架构:
(1)每一个URI代表一种资源;
实现:
规范后的url规范后:http://wwww…/item/101/1,特点是参数通过url传递。
(2)客户端和服务器之间,传递这种资源的某种表现层;
实现:
服务端解析Accept,根据客户端的要求将内容进行输出。
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。
实现:
服务解析客户端请求的http方法,根据不同的方法执行不同的service操作。
<!-- 配置springmvc的rest风格的url解析, -->
<servlet>
<servlet-name>springmvc-rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-rest</servlet-name>
<!-- 注意这个是重点 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
package com.leige.controler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.leige.domain.Student;
import com.leige.service.StudentService;
@Controller
@RequestMapping("/rest")
public class RestControler {
//注入service
@Autowired
@Qualifier(value="studentService")
StudentService studentService;
/** * @param sid * @return返回json * * * @PathVariable将url中的路作为参数赋给方法 * ,注意路径使用占位符 */
@RequestMapping(value="/testRest/{sid}")
public @ResponseBody Student testRest(@PathVariable("sid")Integer sid){
return studentService.selectStudent(sid);
};
}
测试结果:
重要的是理解rest的设计思想,rest的思想讲解:http://www.ruanyifeng.com/blog/2014/05/restful_api.html