SpringMVC--11 Restful开发风格
Posted Moon&&Dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC--11 Restful开发风格相关的知识,希望对你有一定的参考价值。
文章目录
14 Restful开发风格
14.1 Rest概念
可以看作是ReST,Representional State Transfer,是一种理念,直接翻译过来就是表现层状态转换,其实就是一切资源都通过URL来识别和定位,而对资源的一个具体操作(
CRUD
)则通过HTTP方法(GET
,POST
,PUT
,PATCH
,DELETE
)来定义
14.2 Restful定义
Restful开发风格其实基于Rest的一种开发风格,最典型的一个特征就是
前后端分离
- 使用URL作为用户交互的入口
- HTTP方法要明确
- 后端接口只返回数据(结构化数据,以JSON居多),不返回页面
14.3 命名规范
URI | 说明 |
---|---|
GET /cource | 查询所有课程 |
POST /cource | 新增课程 |
PUT /cource/1 | 修改id为1的课程 |
PATCH /cource | 批量修改,一般和PUT不区分 |
DELETE /cource/1 | 删除id为1的课程 |
Tip:
- 在Restful开发风格中,我们需要返回的数据,不再需要返回页面,做到了前后端的分离,那么我们需要添加
@ResponseBody
注解标识我们返回的不是页面。 - 那么在Spring4.0以后,也为我们提供了一个控制层的注解
@RestController
,它其实就是@ResponseBody
和@Controller
的集合,表示该注解的控制器只可以返回数据。
14.4 简单请求和非简单请求
14.4.1 简单请求
标准结构的HTTP请求,比如GET和POST
14.4.2 非简单请求
- 复杂结构的请求,比如PUT/PATCH/DELETE请求
- 对标准请求做了扩展,比如在POST请求头里加了权限信息
14.4.3 区别
非简单请求在请求调用前会调用一次预检请求,所以会出现一个问题,就是后端可以拿到简单请求的携带的参数,但是拿不到非简单请求携带的参数
14.4.4 解决问题
SpringMVC默认是支持传统的请求,所以对于非简单请求的处理也是不可以的,对于该问题的解决,Spring在5.1的时候提出了解决方法,Spring增加了一个过滤器
FormContentFilter
,我们添加这个过滤器以后,就会自动帮我们处理非简单请求。
-
web.xml:
<filter> <filter-name>contentFilter</filter-name> <filter-class>org.springframework.web.filter.FormContentFilter</filter-class> </filter> <filter-mapping> <filter-name>contentFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
JavaConfig:
/** * 过滤器 */ @Override protected Filter[] getServletFilters() { // 非简单请求过滤器 FormContentFilter formContentFilter = new FormContentFilter(); return new Filter[]{encodingFilter, formContentFilter}; }
14.5 Restful案例
14.5.1 JS
$(document).ready(function () {
$('.btn-get').click(function () {
$.ajax({
url: '/adminInfo',
type: 'GET',
dataType: 'json',
success: function (res) {
$('.name').text(res.name);
$('.gender').text(res.gender);
$('.time').text(res.time);
}
})
})
$('.btn-post').click(function () {
$.ajax({
url: '/adminInfo',
type: 'POST',
dataType: 'json',
data: 'name=' + $('#nameInput').val() + '&gender=' + $('#genderInput').val(),
success: function (res) {
$('.name').text(res.name);
$('.gender').text(res.gender);
$('.time').text(res.time);
}
})
})
$('.btn-put').click(function () {
$.ajax({
url: '/adminInfo',
type: 'PUT',
dataType: 'json',
data: 'name=' + $('#nameInput').val() + '&gender=' + $('#genderInput').val(),
success: function (res) {
$('.name').text(res.name);
$('.gender').text(res.gender);
$('.time').text(res.time);
}
})
})
$('.btn-delete').click(function () {
$.ajax({
url: '/adminInfo',
type: 'DELETE',
dataType: 'json',
success: function (res) {
$('.name').text(res.name);
$('.gender').text(res.gender);
$('.time').text(res.time);
}
})
})
})
14.5.2 Java
@RestController
@RequestMapping("/adminInfo")
public class RestfulController {
@Autowired
private AdminInfo adminInfo;
/**
* 处理get
*/
@GetMapping
public AdminInfo getInfo() {
adminInfo.setTime(new Date());
return adminInfo;
}
/**
* 处理post
*/
@PostMapping
public AdminInfo setInfo(AdminInfo adminInfo) {
this.adminInfo = adminInfo;
adminInfo.setTime(new Date());
return adminInfo;
}
/**
* 处理put
*/
@PutMapping
public AdminInfo putInfo(AdminInfo adminInfo) {
this.adminInfo = adminInfo;
adminInfo.setName("PUT方法");
adminInfo.setTime(new Date());
return adminInfo;
}
/**
* 处理Delete
*/
@DeleteMapping
public AdminInfo deleteInfo() {
adminInfo.setName(null);
adminInfo.setGender(null);
adminInfo.setTime(new Date());
return adminInfo;
}
}
以上是关于SpringMVC--11 Restful开发风格的主要内容,如果未能解决你的问题,请参考以下文章