SpringBoot@RequestBody中⽂乱码
今天突然想学习⼀下Restful风,详细的我就不赘述了,我的理解是同⼀个请求路径根据请求⽅式不同进⾏不同的处理
如四种提交⽅式,这⾥推荐⼀个插件Postman,可以模仿各种请求类型,⾃⾏百度安装吧
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的⽅式。
POST(CREATE):在服务器新建⼀个资源,调⽤insert操作。
PUT(UPDATE):在服务器更新资源,调⽤update操作。
DELETE(DELETE):从服务器删除资源,调⽤delete语句
下⾯进⾏实践
前端简易代码
<a href="#" onclick="add()">添加</a>
<a href="#" onclick="del()">删除</a>
<a href="#" onclick="select()">查询</a>
<a href="#" onclick="update()">修改</a>
postman的中文翻译<script src="/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
function add(){
var id = "111111111";
$.ajax({
type:"POST",
url:"test.do",
data:{id:"添加11111111111"}});
}
function del(){
var id = "2222222";
$.ajax({
type:"DELETE",
url:"test.do",
data:{id:"删除22222222222"},
contentType : "text/html;charset=UTF-8",
dataType:"json"});
}
function select(){
var id = "33333";
$.ajax({
type:"GET",
url:"test.do",
data:{id:"查询3333333333"}});
}
function update(){
var id = "111111111";
$.ajax({
type:"PUT",
url:"test.do",
data:{id:"修改4444444"}});
}
</script>
后台简易代码
@RequestMapping(value = "/test.do", method = RequestMethod.DELETE)
public void test(String id){
System.out.println("删除");
System.out.println(id);
}
@RequestMapping(value = "/test.do", method = RequestMethod.POST)
public void test1(String id){
System.out.println("添加");
System.out.println(id);
}
@RequestMapping(value = "/test.do", method = RequestMethod.PUT)
public void test2(String id){
System.out.println("修改");
System.out.println(id);
}
@RequestMapping(value = "/test.do", method = RequestMethod.GET)
public void test3(String id){
System.out.println("查询");
System.out.println(id);
}
前台ajax的提交⽅式对应于后台@RequestMapping(value = "/test.do", method = RequestMethod.⽅式)
控制台:
添加
添加11111111111
2018-10-26 09:28:45.325 DEBUG 8500 --- [nio-8080-exec-4] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.tor.RequestFacade@718e55d2
2018-10-26 09:28:45.977 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.tor.RequestFacade@718e55d2
删除
null
2018-10-26 09:28:45.984 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.tor.RequestFacade@718e55d2
2018-10-26 09:28:46.731 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.tor.RequestFacade@718e55d2
查询
查询3333333333
2018-10-26 09:28:46.734 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.tor.RequestFacade@718e55d2
2018-10-26 09:28:47.585 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@535448c
修改
修改4444444
2018-10-26 09:28:47.590 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@53544可见Restful已经根据不同的提交⽅式进⼊不同的⽅法了,后⾯⼤家就可以⾃⾏处理了,但是还有⼀个问题,当提交⽅式为DELETE时,接收的id值为null
在参数列表中加⼊@RequestBody注解,这⾥的作⽤是通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,也可以将其分别绑定到对应的字符串上。
@RequestMapping(value = "/lll.do", method = RequestMethod.DELETE)
public void test(@RequestBody String id){
System.out.println("删除");
System.out.println(id);
}
控制台:
2018-10-26 10:31:09.661 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.tor.RequestFacade@4bafd197
删除
id=%E5%88%A0%E9%99%A422222222222
2018-10-26 10:31:09.667 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.tor.RequestFacade@4bafd197可以看到,是可以获取到数据了,但是会出现中⽂乱码,这个中⽂乱码超级顽固,设置了很多都没⽤,最后在前台这样设置就可以了
function del(){
var id = "删除sssss22222222222";
$.ajax({
type:"DELETE",
url:"lll.do",
data:JSON.stringify(id),
contentType :"application/json",
dataType:"json"});
}
JSON.stringify() ⽅法⽤于将 JavaScript 值转换为 JSON 字符串。
这样控制台的输出就变成了:
2018-10-26 13:42:59.585 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.tor.RequestFacade@343dbcb6
删除
"删除sssss22222222222"
2018-10-26 13:42:59.587 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.tor.RequestFacade@343dbcb6
为什么参数变成字符串就不乱码了呢?原来@RequestBody主要⽤来接收前端传递给后端的json字符串中的数据的,注意⼀定是字符串
这⾥给出JSON字符串和JSON对象的区别
JSON字符串
var data ='{"id":"删除sssss22222222222"}';//字符串是单引号或者双引号引起来的
JSON对象
var data ={"id":"删除sssss22222222222"};
所有上⾯的JSON.stringify()还可以改成声明成JSON字符串传输
JSON对象转JSON字符串可以⽤JSON.stringify()⽅法
反过来JSON字符串转JSON对象可以⽤JSON.parse()⽅法
$.ajax({
url : 'login.php',
type : 'post',
data : {id:id,name:name}, //这⾥是json对象
success : function(data){......}
)};
默认是以application/x-www-form-urlencoded⽅式提交。也就是常见的表单提交⽅式
如果使⽤ajax的application/json⽅式,记得data参数是字符串类型的。使⽤JSON.stringify()转换⼀下
⾄于什么时候⽤@RequestBody呢?
GET、POST⽅式提时,根据request header Content-Type的值来判断:
application/x-www-form-urlencoded,可选(即⾮必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使⽤@RequestBody不能处理这种格式的数据);
其他格式,必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使⽤@RequestBody来处理)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论