什么是REST?
REST是Representational State Transfer的缩写。翻译为"表现层状态转化"。
Restful就是一个资源定位及资源操作的风格。
不是标准也不是协议,只是一种风格。
RESTful的重点之一就是统一的接口命名规则,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
传统访问路径与RESTFul风格区别
-
传统方式操作资源
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST -
使用RESTful操作资源
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
RESTful风格
rest将每一个URI都看作是一个资源,这是一个概念,实际可以是一个图片,一条记录,一组记录都可以;
每一种请求方法都对应着对某个资源的操作,通常包含以下四种:
- GET 获取资源
- PUT 更新资源
- POST 提交资源
- DELETE 删除资源
假设我们将id为1的用户数据看做是一个资源,那么我们要在前台操作这个资源时就要向服务器发送能够定位这个资源的请求地址,
如:http://localhost:8080/SSMDemo/user/1 ,通过URI找到资源
后,我们还要告诉服务器我们要对这个资源进行什么样的操作
,就通过HTTP的请求方法;如GET
简单的说:RESTful就是用URI来定位资源,在通过请求方法来定义要执行的操作;
RESTful的无状态性:
无状态约束使服务器的变化对客户端是不可见的,两次连续的请求中,客户端可以不依赖于同一台服务器,这使得服务器具备更好的伸缩性;
RESTful的好处
降低开发的复杂性,提高系统的可伸缩性,使得接口更加规范化;
URI与URL:
URL是统一资源标识 (只要能唯一标识一个资源就叫做URI)
URL是统一资源路径
URL属于URI的一种
SpringMVC中的RESTful
可以看出来,RESTful的变化在于,请求地址的处理,以及请求方法的定义;
我们有两个事情要做:
- 需要从URL中获取一些参数
- 使得同一个接口的不同请求方法可以完成对应的操作
使用方法
案例:设计一个对学生资源进行操作的RESTful接口
编写controller
@RestController
public class StudentController2 {
@Autowired
private StudentService studentService;
//查询所有学生
@RequestMapping(value = "/selectAll1", method = RequestMethod.GET)
public List<Student> selectAll() {
return studentService.selectAll();
}
//根据id查询学生
@RequestMapping(value = "/selectByID1/{id}", method = RequestMethod.GET)
//@PathVariable 注解用于从请求地址中获取id参数
public Student selectByID(@PathVariable Integer id) {
System.out.println(id);
return studentService.selectByID(id);
}
//添加新的学生
@RequestMapping(value = "/addStudent1", method = RequestMethod.POST)
public String addStudent(@RequestBody Student student) {
studentService.insertStudent(student);
System.out.println(student);
return "{\"code\":\"添加成功\"}";
}
//更新学生信息
@RequestMapping(value = "/updateStudent1", method = RequestMethod.PUT)
public String updateStudent(@RequestBody Student student) {
studentService.insertStudent(student);
return "{\"code\":\"更新成功\"}";
}
//删除学生信息
@RequestMapping(value = "/deleteStudent1/{id}", method = RequestMethod.DELETE)
public String deleteStudent(@PathVariable Integer id) {
studentService.deleteStudent(id);
return "{\"code\":\"删除成功\"}";
}
}
@PathVariable是专门用于从url中获取参数的,在RequestMapping中添加{参数名称},作为占位符, 参数名称需要与方法中的参数名称相同,若不同可以为@PathVariable添加value(通常没必要这么做),像下面这样:
@RequestMapping(value = "/course/{cid}",method = RequestMethod.GET)
public Course getCourse(@PathVariable("cid") Integer id){
System.out.println("getCourse");
System.out.println("参数:"+id);
return service.selectByID(id);
}
接口测试推荐使用postman,
另外在实际开发中我们需要前台传递用户令牌,以验证身份;可以通过拦截器来实现;
补充
Tomcat 只会解析get和post中的参数,若SpringMVC中使用了PUT或是DELETE,并且使用的是表单提交,那么将无法获取参数,应为Tomcat没有经参数接续出来放到request中,SpringMVC提供了一个过滤器,专门帮助tomcat解析put/delete中的参数并放入request中,配置方法如下:
web.xml:
<!--配置SpringMVC,解析PUT/DELETE的表单数据放入request-->
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上述的问题在使用json交互时不会出现,因为SpringMVC是直接从请求体中获取json数据的,不通过request;
注意:如果页面上的表单使用了PUT/或DELETE请求方式,就需要在web.xml中加入上面的过滤器;