RequestMapping 的 method 类型有 GET、HEAD、POST、PATCH、DELETE、OPTIONS、TRACE。可以通过这些 method 来处理前端用不同方法提交的数据
GET
GET 方法是最常用的方法。用 GET 方法可以获取资源。比如,以下代码用 GET 方法获取所有图书
@RequestMapping("/select")
@ResponseBody
public List<Bookshelf> select1() {
return bookService.selectBook();
}
等同于
@GetMapping("/select")
@ResponseBody
public List<Bookshelf> select2() {
return bookService.selectBook();
}
DELETE
如果需要删除一个数据,根据 Restful 风格则需要使用 DELETE 方法。在使用 DELETE 方法删除资源的时候,要注意判断是否成功,因为 返回的是 VOID 类型。
一般有以下三个方法判断。
- 使用 try catch exception :如果不发生异常,则默认为成功,但这样并不好。
- 通过存储过程返回值来判断是否正确执行:如果执行成功,则返回 1 或 大于 0 的值;如果执行失败,则返回 0。
- 在执行 DELETE 方法前首先查询是否有数据:在执行 DELETE 方法后返回值是 0,所以,一般先查询一下是否有数据
后端 :
@DeleteMapping("/delete")
//(同上)@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
@ResponseBody
public int delete2(@RequestParam(value = "id", required = true) int id) {
return bookService.deleteById(id);
}
前端 AJAX 请求:
<body>
<input type="text" id="deleteTest">
<button id="delete2">delete2</button>
</body>
<script>
$("#delete2").on('click', function () {
const deleteTest = $("#deleteTest").val();
$.ajax({
url: "http://localhost:8080/delete",
type: 'DELETE',
dataType: 'json',
data: {'_method': 'DELETE', 'id': deleteTest},
success: function (data) {
console.log(data)
},
error: function (e) {
}
});
});
</script>
POST
如果需要添加对象,那一般会使用 POST 的方法传递一个 Model 对象
GET 和 POST 的区别:
- GET 在浏览器中可以回退,而 POST 访问同一个地址时也是再次提交请求。
- GET 请求会被浏览器主动缓存,而 POST 则不会。
- GET 中的参数会被完整地保留在浏览器历史记录里,而 POST 中的参数则不会被保留。
- GET 只能进行 URL 编码,而 POST 支持多种编码方式。
- GET 只接收ASCII字符,而POST没有限制。
- GET 的安全性相比 POST 低,因为参数直接暴露在 URL 上,所以不能用它递敏感信息。
- GET 的参数是通过 URL 传递的,而 POST 的参数是放在request body中的。但是,以上这些都不是绝对的,比如 POST 也可以通过 URL 路径提交参数。
后端:
@PostMapping("/add")
// (同上) @RequestMapping(value = "/add",method = RequestMethod.POST)
@ResponseBody
public int add(@ModelAttribute("bookshelf") Bookshelf bookshelf) {
return bookService.add(bookshelf);
}
前端 form 表单
<body>
<form action="http://localhost:8080/add" method="post">
id:<input type="text" name="bkno">
输入1:<input type="text" name="bklocation">
输入2:<input type="text" name="bcategory">
<input type="submit" value="提交">
</form>
</body>
PUT
如果对象需要更新,则用PUT方法发送请求。
后端:
@PutMapping("/update")
// (同上) @RequestMapping(value = "/update" ,method = RequestMethod.PUT)
@ResponseBody
public String update2(@RequestParam(value = "id", required = true) int id) {
Bookshelf bookshelf = new Bookshelf();
bookshelf.setBkno(id);
bookshelf.setBcategory("更改1");
bookshelf.setBklocation("更改2");
bookService.updateById(bookshelf);
return "ok";
}
前端 AJAX 请求:
<body>
<input type="text" id="updateTestOfPUT">
<button id="update2">updateTestOfPUT</button>
</body>
<script>
$("#update2").on('click', function () {
const updateTestOfPUT = $("#updateTestOfPUT").val();
$.ajax({
url: "http://localhost:8080/update",
type: 'PUT',
dataType: 'json',
data: {'_method': 'PUT', 'id': updateTestOfPUT},
success: function (data) {
console.log(data)
},
error: function (e) {
}
});
});
<script>
PATCH
PATCH是个新引入的方法,是对PUT方法的补充,用来对已知资源进行局部更新。
很多人对这个方法不太理解,因为使用PUT和PATCH方法都能成功,导致不太理解什么是局部更新。下面以更新 pojo 对象来理解它们的区别。
比如:User对象有id、name、password. sex 等属性。如果只需要修改name的值,则此时的更新操作就可以用 PATCH 方法。
但是在大多数的应用程序中,很多人都会使用 PUT 方法提交完整的 pojo 对象给后端。这种值法虽然在功能上是可以实现的,但对资源是一种浪费——提交的数据过多了。 如果遇到文章类型的对象,为了改一个标题,而要同时提交很多的内容实在是不划算(一篇文章一般由标题和内容等构成,内容往往很多)。
后端:
@PatchMapping("/update")
// @RequestMapping(value = "/update" ,method = RequestMethod.PATCH)
@ResponseBody
public String update3(@RequestParam(value = "id", required = true) int id) {
Bookshelf bookshelf = new Bookshelf();
bookshelf.setBkno(id);
bookshelf.setBcategory("更改1");
bookService.updateById(bookshelf);
return "ok";
}
前端 AJAX 请求:
<body>
<input type="text" id="updateTestOfPATCH">
<button id="update3">updateTestOfPATCH</button>
</body>
<script>
$("#update3").on('click', function () {
const updateTestOfPATCH = $("#updateTestOfPATCH").val();
$.ajax({
url: "http://localhost:8080/update",
type: 'PATCH',
dataType: 'json',
data: {'_method': 'PATCH', 'id': updateTestOfPATCH},
success: function (data) {
console.log(data)
},
error: function (e) {
}
});
})
</script>
局部更新可使用 Mybatis-plus 实现
OPTIONS
该方法用于获取当前URL。若请求成功,则会在 HTTP ( HyperText Transfer Protocol,超文本传输协议) 头中包含一个名为 “Allow" 的头,其值是所支持的方法,如值为“GET、POST"。它还允许客户端查看服务器的性能。如果遇到“500错误”,则OPTIONS不进行第二次请求。
TRACE
它显示服务器收到的请求,主要用于测试或诊断。