今天突然想学习一下Restful风,详细的我就不赘述了,我的理解是同一个请求路径根据请求方式不同进行不同的处理

如四种提交方式,这里推荐一个插件Postman,可以模仿各种请求类型,自行百度安装吧

  1. GETSELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。  
  2. POSTCREATE):在服务器新建一个资源,调用insert操作。  
  3. PUTUPDATE):在服务器更新资源,调用update操作。  
  4. DELETEDELETE):从服务器删除资源,调用delete语句

下面进行实践

前端简易代码

  1. <a href="#" onclick="add()">添加</a>
  2. <a href="#" onclick="del()">删除</a>
  3. <a href="#" onclick="select()">查询</a>
  4. <a href="#" onclick="update()">修改</a>
  5.  
  6. <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  7. <script type="text/javascript">
  8. function add(){
  9. var id = "111111111";
  10. $.ajax({
  11. type:"POST",
  12. url:"test.do",
  13. data:{id:"添加11111111111"}});
  14. }
  15.  
  16. function del(){
  17. var id = "2222222";
  18. $.ajax({
  19. type:"DELETE",
  20. url:"test.do",
  21. data:{id:"删除22222222222"},
  22. contentType : "text/html;charset=UTF-8",
  23. dataType:"json"});
  24. }
  25.  
  26. function select(){
  27. var id = "33333";
  28. $.ajax({
  29. type:"GET",
  30. url:"test.do",
  31. data:{id:"查询3333333333"}});
  32. }
  33.  
  34. function update(){
  35. var id = "111111111";
  36. $.ajax({
  37. type:"PUT",
  38. url:"test.do",
  39. data:{id:"修改4444444"}});
  40. }
  41. </script>

后台简易代码

  1. @RequestMapping(value = "/test.do", method = RequestMethod.DELETE)
  2. public void test(String id){
  3. System.out.println("删除");
  4. System.out.println(id);
  5. }
  6.  
  7. @RequestMapping(value = "/test.do", method = RequestMethod.POST)
  8. public void test1(String id){
  9. System.out.println("添加");
  10. System.out.println(id);
  11. }
  12.  
  13. @RequestMapping(value = "/test.do", method = RequestMethod.PUT)
  14. public void test2(String id){
  15. System.out.println("修改");
  16. System.out.println(id);
  17. }
  18.  
  19. @RequestMapping(value = "/test.do", method = RequestMethod.GET)
  20. public void test3(String id){
  21. System.out.println("查询");
  22. System.out.println(id);
  23. }

前台ajax的提交方式对应于后台@RequestMapping(value = "/test.do", method = RequestMethod.方式)

控制台:

  1. 添加
  2. 添加11111111111
  3. 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
  4. 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
  5. 删除
  6. null
  7. 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
  8. 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
  9. 查询
  10. 查询3333333333
  11. 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
  12. 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
  13. 修改
  14. 修改4444444
  15. 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上,也可以将其分别绑定到对应的字符串上。

  1. @RequestMapping(value = "/lll.do", method = RequestMethod.DELETE)
  2. public void test(@RequestBody String id){
  3. System.out.println("删除");
  4. System.out.println(id);
  5. }

控制台:

  1. 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
  2. 删除
  3. id=%E5%88%A0%E9%99%A422222222222
  4. 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

可以看到,是可以获取到数据了,但是会出现中文乱码,这个中文乱码超级顽固,设置了很多都没用,最后在前台这样设置就可以了

  1. function del(){
  2. var id = "删除sssss22222222222";
  3. $.ajax({
  4. type:"DELETE",
  5. url:"lll.do",
  6. data:JSON.stringify(id),
  7. contentType :"application/json",
  8. dataType:"json"});
  9. }

JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。

这样控制台的输出就变成了:

  1. 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
  2. 删除
  3. "删除sssss22222222222"
  4. 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对象的区别

  1. JSON字符串
  2. var data ='{"id":"删除sssss22222222222"}';//字符串是单引号或者双引号引起来的
  3.  
  4. JSON对象
  5. 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呢?

  1. GETPOST方式提时, 根据request header Content-Type的值来判断:
  2. application/x-www-form-urlencoded 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  3. multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  4. 其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理)。

SpringBoot @RequestBody 中文乱码的更多相关文章

  1. SpringBoot 配置文件 中文乱码

    本方案,支持springboot 很简单 在配置文件中不写中文,写中文的ascll码 直接百度在线转ASCII,用工具 把中文转ASCII码==>\u628a\u4e2d\u6587\u8f6c ...

  2. springboot + post 中文乱码

    去检查你的 filter 配置,是否配置了一个最高优先级的 filter, 这个最高优先级的 filter 会影响 springboot 自动配置的 CharacterEncodingFilter.原 ...

  3. Spring Boot 中文乱码问题解决方案汇总

    使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下: 第一步,约定传参编码格式 不管是使用httpclient,还是okhttp,都 ...

  4. springboot使用i18n时properties文件中文乱码

    在springboot使用i18n进行国际化文件配置时,文件名为messages_zh_CN.properties的文件中填写中文信息,当使用浏览器进行访问时,出现中文乱码,此时在idea中进行修改s ...

  5. springboot使用fastjson中文乱码解决方法 【转载】

    以前使用fastjson替换jackson时,没有直接在页面打印过json,都是js使用没有出现乱码,偶然 打印出来出现了中文乱码 之前使用的配置方式 @Configuration public cl ...

  6. Springboot使用FastJson后,接口返回中文乱码的问题解决。

    哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...

  7. Springboot @ResponseBody返回中文乱码

    最近我在把Spring 项目改造Springboot,遇到一个问题@ResponseBody返回中文乱码,因为response返回的content-type一直是application/json;ch ...

  8. springboot同时支持访问html5和jsp时,导致后台ResponseBody返回中文乱码

    背景:原系统是由springboot jsp,所有访问都是jsp 现在需要做HTML5定位,要同时支持访问HTML5和JSP 在application.yml的spring标签下配置 mvc: #vi ...

  9. SpringBoot集成thymeleaf(自定义)模板中文乱码的解决办法

    楼主今天在学习SpringBoot集成thymelaf的时候报了中文乱码的错误,经过网上的搜索,现在得到解决的办法,分享给大家: package com.imooc.config; import or ...

随机推荐

  1. 初识ASP.net-牛腩新闻公布系统

           在做牛腩新闻公布的系统的时候,总有一种感觉就是:我仍然在敲机房收费系统,唯一不同的一点.就是敲机房收费的时候,用户界面是是自己手动画界面.而,在牛腩新闻公布系统中,用户界面,却是须要自己 ...

  2. Jquery获取iframe中的元素

    iframe与父页面之间相互获取元素的方法: 1.从父页面中获取iframe页面中的元素: 用法: $(window.frames["iframe_include_adverse" ...

  3. Can a GridView have a footer and header just like ListView?

    Aquick question: In ListView I use this code: list.addHeaderView(headerView); How to deal with it wh ...

  4. Asp.net MVC3 异常全局过滤器处理

    1.建立异常全局过滤器处理机制,在Gloabal.asax.cs文件中,有如下代码块: public static void RegisterGlobalFilters(GlobalFilterCol ...

  5. WebApi基础

    1:当Controller中有相同参数的方法时,请求调用会报错 [HttpGet] public IEnumerable<string> Resturn() { return new st ...

  6. 通用分页(Jquery版)

    1.简单定义下样式 <style type="text/css"> .fanye { color: blue; margin-right: 15px; text-dec ...

  7. 九度OJ 1064:反序数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3758 解决:2773 题目描述: 设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321) 求N的值 输入: 程序无任 ...

  8. 九度OJ 1048:判断三角形类型 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6794 解决:3361 题目描述: 给定三角形的三条边,a,b,c.判断该三角形类型. 输入: 测试数据有多组,每组输入三角形的三条边. 输 ...

  9. segnet 编译与测试

    segnet 编译与测试参考:http://sunxg13.github.io/2015/09/10/caffe/http://m.blog.csdn.net/lemianli/article/det ...

  10. MySQL修改配置 区分大小写

    在使用mysql的时候,数据库名,表名,字段名等有大小写的区分,这个可以通过配置文件设置.如果设置了严格区分大小写,在访问表的时候没有注意到表名的大小写,将会报出表不存在的错误.下面是修改配置文件: ...