简单请求是指标准结构的HTTP请求,对应GET/POST请求。
非简单请求是复杂要求的HTTP请求,指PUT/DELETE、扩展标准请求。
两者最大区别是非简单请求发送前需要发送预检请求。
我们修改client.html的post和put请求js部分
$("#btnPost").click(function (){
$.ajax({
url:"/restful/request/100",
type:"post",
data:"name=lily&age=23",
dataType:"json",
success:function (json){
$("#message").text(json.message+":"+json.id);
}
})
})
$("#btnPut").click(function (){
$.ajax({
url:"/restful/request",
type:"put",
data:"name=lily&age=23",
dataType:"json",
success:function (json){
$("#message").text(json.message);
}
})
})
在com.ql.restful.entity包下创建Person实体类
package com.ql.restful.entity;
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
然后修改RestfulController
package com.ql.restful.controller;
import com.ql.restful.entity.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/restful")
public class RestfulController {
@GetMapping("request")
// @ResponseBody
public String doGetRequest(){
return "{\"message\":\"返回查询结果\"}";
}
@PostMapping("request/{rid}")
// @ResponseBody
public String doPostRequest(@PathVariable("rid") Integer requestId, Person person){
System.out.println(person.getName()+":"+person.getAge());
return "{\"message\":\"数据新建成功\",\"id\":"+requestId+"}";
}
@PutMapping("request")
// @ResponseBody
public String doPutRequest(Person person){
System.out.println(person.getName()+":"+person.getAge());
return "{\"message\":\"数据更新成功\"}";
}
@DeleteMapping("request")
// @ResponseBody
public String doDeleteRequest(){
return "{\"message\":\"数据删除成功\"}";
}
}
运行依次测试post、put请求
发现put请求并没能接收到参数。
SpringMVC最早的时候是对网页服务的,默认网页表单提交时只支持简单请求(get、post请求)。随着技术的演进,也需要考虑put、delete请求,SpringMVC提供了额外的表单内容过滤器,来对put、delete请求额外处理。
在web.xml文件中添加FormContentFilter过滤器配置
<filter>
<filter-name>formContentFilterfilter-name>
<filter-class>org.springframework.web.filter.FormContentFilterfilter-class>
filter>
<filter-mapping>
<filter-name>formContentFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
然后重启项目再测试
post和put请求都能接收到参数了。
打开项目pom.xml引入jackson依赖(注意使用2.10.x以上版本,2.x < 2.9.10.8版本存在反序列化漏洞)
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.12.6version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.12.6version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.12.6version>
dependency>
SpringMVC非常的智能,它会检测当前类路径一旦存在jackson相关包,会自动提供JSON序列化服务,不需要额外配置。
然后打开com.ql.restful.controller包下RestfulController类添加方法
@GetMapping("/person")
public Person findByPersonId(Integer id){
Person person = new Person();
if(id==1){
person.setName("lily");
person.setAge(23);
}else if(id==2){
person.setName("smith");
person.setAge(22);
}
return person;
}
@GetMapping("/persons")
public List<Person> findPersons(){
List list = new ArrayList();
Person person1 = new Person();
person1.setName("lily");
person1.setAge(23);
list.add(person1);
Person person2 = new Person();
person2.setName("smith");
person2.setAge(22);
list.add(person2);
return list;
}
当方法返回实体对象或集合,且有@ResponseBody注解时,SpringMVC会自动通过jackson对实体对象或集合进行序列化输出。
运行项目,在浏览器地址栏中输入http://localhost:8080/restful/person?id=1
在浏览器地址栏中输入http://localhost:8080/restful/persons
修改src/main/webapp/client.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RESTful实验室title>
<script src="jquery-3.6.0.min.js">script>
<script>
$(function (){
$("#btnGet").click(function (){
$.ajax({
url:"/restful/request",
type:"get",
dataType:"json",
success:function (json){
$("#message").text(json.message);
}
})
})
$("#btnPost").click(function (){
$.ajax({
url:"/restful/request/100",
type:"post",
data:"name=lily&age=23",
dataType:"json",
success:function (json){
$("#message").text(json.message+":"+json.id);
}
})
})
$("#btnPut").click(function (){
$.ajax({
url:"/restful/request",
type:"put",
data:"name=lily&age=23",
dataType:"json",
success:function (json){
$("#message").text(json.message);
}
})
})
$("#btnDelete").click(function (){
$.ajax({
url:"/restful/request",
type:"delete",
dataType:"json",
success:function (json){
$("#message").text(json.message);
}
})
})
$("#btnPersons").click(function (){
$.ajax({
url:"/restful/persons",
type: "get",
dataType: "json",
success: function (json){
for(let i=0; i<json.length; i++){
$("#divPersons").append(""
+json[i].name+"-"+json[i].age+"");
}
}
})
})
})
script>
head>
<body>
<input type="button" id="btnGet" value="发送Get请求">
<input type="button" id="btnPost" value="发送Post请求">
<input type="button" id="btnPut" value="发送Put请求">
<input type="button" id="btnDelete" value="发送Delete请求">
<h1 id="message">h1>
<hr/>
<input type="button" id="btnPersons" value="查询所有人员">
<div id="divPersons">div>
body>
html>
运行工程,点击查询所有人员测试
jackson对时间格式默认支持的不是特别理想。
在Person实体类中添加时间格式属性
package com.ql.restful.entity;
import java.util.Date;
public class Person {
private String name;
private Integer age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
然后修改RestfulController中的findPersons方法
@GetMapping("/persons")
public List<Person> findPersons(){
List list = new ArrayList();
Person person1 = new Person();
person1.setName("lily");
person1.setAge(23);
person1.setBirthday(new Date());
list.add(person1);
Person person2 = new Person();
person2.setName("smith");
person2.setAge(22);
person2.setBirthday(new Date());
list.add(person2);
return list;
}
修改src/main/webapp/client.html中的查询所有人员按钮点击事件js
$("#btnPersons").click(function (){
$.ajax({
url:"/restful/persons",
type: "get",
dataType: "json",
success: function (json){
for(let i=0; i<json.length; i++){
$("#divPersons").append(""
+json[i].name+"-"+json[i].age+"-"+json[i].birthday+"");
}
}
})
})
再次运行工程测试
得知默认展示为时间戳,为了解决这个问题,jackson提出相应注解,修改Person实体类
package com.ql.restful.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
重新运行工程,时间显式正常