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> <script src="https://cdn.staticfile.org/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.apache.catalina.connector.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.apache.catalina.connector.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.apache.catalina.connector.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.apache.catalina.connector.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.apache.catalina.connector.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@535448c
可见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.apache.catalina.connector.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.apache.catalina.connector.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.apache.catalina.connector.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.apache.catalina.connector.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来处理)。
SpringBoot @RequestBody 中文乱码的更多相关文章
- SpringBoot 配置文件 中文乱码
本方案,支持springboot 很简单 在配置文件中不写中文,写中文的ascll码 直接百度在线转ASCII,用工具 把中文转ASCII码==>\u628a\u4e2d\u6587\u8f6c ...
- springboot + post 中文乱码
去检查你的 filter 配置,是否配置了一个最高优先级的 filter, 这个最高优先级的 filter 会影响 springboot 自动配置的 CharacterEncodingFilter.原 ...
- Spring Boot 中文乱码问题解决方案汇总
使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下: 第一步,约定传参编码格式 不管是使用httpclient,还是okhttp,都 ...
- springboot使用i18n时properties文件中文乱码
在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...
- springboot使用fastjson中文乱码解决方法 【转载】
以前使用fastjson替换jackson时,没有直接在页面打印过json,都是js使用没有出现乱码,偶然 打印出来出现了中文乱码 之前使用的配置方式 @Configuration public cl ...
- Springboot使用FastJson后,接口返回中文乱码的问题解决。
哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...
- Springboot @ResponseBody返回中文乱码
最近我在把Spring 项目改造Springboot,遇到一个问题@ResponseBody返回中文乱码,因为response返回的content-type一直是application/json;ch ...
- springboot同时支持访问html5和jsp时,导致后台ResponseBody返回中文乱码
背景:原系统是由springboot jsp,所有访问都是jsp 现在需要做HTML5定位,要同时支持访问HTML5和JSP 在application.yml的spring标签下配置 mvc: #vi ...
- SpringBoot集成thymeleaf(自定义)模板中文乱码的解决办法
楼主今天在学习SpringBoot集成thymelaf的时候报了中文乱码的错误,经过网上的搜索,现在得到解决的办法,分享给大家: package com.imooc.config; import or ...
随机推荐
- HDU 1452 Happy 2004(唯一分解定理)
题目链接:传送门 题意: 求2004^x的全部约数的和. 分析: 由唯一分解定理可知 x=p1^a1*p2^a2*...*pn^an 那么其约数和 sum = (p1^0+p1^1^-+p1^a1)* ...
- pip3 Fatal error in launcher: Unable to create process using '"' [转]
在新环境上安装python的时候又再次遇到了这个情况,这次留意了一下,发现原来的文章有错误的地方,所以来更新一下,应该能解决大部分的问题. 环境是win8,原来只安装了python2.7.后来因为要用 ...
- virtual dynamic shared object
vdso(7) - Linux manual page http://man7.org/linux/man-pages/man7/vdso.7.html NAME | SYNOPSIS | DESCR ...
- A good example is a User-Agent switcher which changes User-Agent on every request:
Configuration | Colly http://go-colly.org/docs/introduction/configuration/
- 【题解】DZY Loves Chinese
[题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...
- HNOI2017
本蒟蒻表示终于把$HNOI2017$全AC了... 万岁! 附上各个题的题解: $DAY1$: $T1$: BZOJ4825: [Hnoi2017]单旋 $T2$: BZOJ4826: [Hnoi20 ...
- PHP接口中的静态变量、常量与类中静态变量、常量的区别
接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不 ...
- (转)浅析三层架构与MVC模式的区别
MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据 ...
- LeetCode:分发饼干【455】
LeetCode:分发饼干[455] 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的 ...
- IO多路复用之Reactor模式
首先,我们来看看同步和异步. 在处理 IO 的时候,阻塞和非阻塞都是同步 IO.只有使用了特殊的 API 才是异步 IO. 接下来,我们来看看Linux下的三大同步IO多路复用函数 fcntl(fd, ...