服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot前后端json数据交互的全过程记录

SpringBoot前后端json数据交互的全过程记录

2022-09-20 18:36北冥友余 Java教程

现在大多数互联网项目都是采用前后端分离的方式开发,下面这篇文章主要给大家介绍了关于SpringBoot前后端json数据交互的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一、参考文献

原生Ajax与JQuery Ajax

SpringMVC接受JSON参数详解及常见错误总结

  • 提交方式为 POST 时,
  • JQuery Ajax 以 application/x-www-form-urlencoded 上传 JSON对象 ,
  • 后端用 @RequestParam 或者Servlet 获取参数。
  • JQuery Ajax 以 application/json 上传 JSON字符串,
  • 后端用 @RquestBody 获取参数。
  • 总结成表

SpringBoot前后端json数据交互的全过程记录

Controller接收参数以及参数校验

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

二、勇敢尝试

前端js发送ajax请求( application/x-www-form-urlencoded )

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var jsonObj = {"openid":"xxx","username":"Ed sheeran","password":"123"};
   /*
       Jquery默认Content-Type为application/x-www-form-urlencoded类型
    */
   $.ajax({
       type: 'POST',
       url: "/login",
       dataType: "json",
       data: JSON.stringify(jsonObj),
       success: function(data) {
           console.log(data)
       },
       error: function() {
           console.log("fucking error")
       }
   });

后端Servlet接受参数。前端报 200,后端报 返回值都是null

?
1
2
3
4
5
6
7
8
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(HttpServletRequest request){
      System.err.println(request.getParameter("openid"));
      System.err.println(request.getParameter("username"));
      System.err.println(request.getParameter("password"));
}

后端改 @RequestParam 接受参数。前端报 404,后端报 Required String parameter ‘username’ is not present

?
1
2
3
4
5
6
7
8
9
10
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestParam("username") String username,
                    @RequestParam("password") String password,
                    @RequestParam("openid") String openid){
      System.err.println(username);
      System.err.println(password);
      System.err.println(openid);
  }

后端改 @RequestBody 接受参数。前端报 415,后端报 Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported

Http status 415 Unsupported Media Type

What is 415 ?

HTTP 415 Unsupported Media Type

The client error response code indicates that the server refuses to accept the request because the payload format is in an unsupported format.

Let’s look at the broswer ?

SpringBoot前后端json数据交互的全过程记录

How to resolve 405 problem when using ajax post @ResponseBody return json data ?

  • if you use Spring 4.x jar,please following me(Maven Repository-Spring 4.x.jar)
  • add related jar package

spring-webmvc.x.x.jar

jackson-databind.jar

jackson-core.jar

jackson-annotations.jar

  • In Spring Configuration file,add following code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<bean class="org.springframework.web.servlet.mvc.
annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"
        <list
            <ref bean="jsonHttpMessageConverter" /> 
        </list
    </property
</bean
 
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.
MappingJackson2HttpMessageConverter"> 
    <property name="supportedMediaTypes"
        <list
          <value>application/json;charset=UTF-8</value
        </list
    </property
</bean>
  • In ajax , set contentType : ‘application/json;charse=UTF-8’
?
1
2
3
4
5
6
7
8
9
10
11
var data = {"name":"jsutin","age":18};
$.ajax({ 
    url : "/ASW/login.html"
    type : "POST"
    data : JSON.stringify(data), 
    dataType: 'json'
    contentType:'application/json;charset=UTF-8',     
    success : function(result) { 
        console.log(result); 
    
});

In server ,using @RequestBody anotation receive json data,and using @ResponseBody anotation response json to jsp page

?
1
2
3
4
5
@RequestMapping(value = "/login",method = RequestMethod.POST)
public @ResponseBody User login(@RequestBody User user){
    system.out.println(user.getName);
    system.out.println(user.getAge);
}
?
1
2
3
4
5
6
7
8
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestBody Map<String,Object> map){
      System.err.println(map.get("username"));
      System.err.println(map.get("password"));
      System.err.println(map.get("openid"));
  }

前端加 contentType : “application/json”。前端报 200,后端 能接受到参数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
          type: 'POST',
          url: "/login",
          dataType: "json",
          data: JSON.stringify(jsonObj),
          contentType : "application/json",
          success: function(data) {
              console.log(data)
          },
          error: function() {
              console.log("fucking error")
          }
      });
?
1
2
3
4
5
6
7
8
9
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestBody Map<String,Object> map){
      System.err.println(map.get("username"));
      System.err.println(map.get("password"));
      System.err.println(map.get("openid"));
}
}

有时候,我想在后端使用对象来获取参数。前端报 200,后端 也ok

?
1
2
3
4
5
6
7
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestBody Form form){
      System.err.println(form);
}
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Form {
  private String openid;
  private String username;
  private String password;
 
  public String getOpenid() {
      return openid;
  }
 
  public void setOpenid(String openid) {
      this.openid = openid;
  }
 
  public String getUsername() {
      return username;
  }
 
  public void setUsername(String username) {
      this.username = username;
  }
 
  public String getPassword() {
      return password;
  }
 
  public void setPassword(String password) {
      this.password = password;
  }
 
  @Override
  public String toString() {
      return "Form{" +
              "openid='" + openid + '\'' +
              ", username='" + username + '\'' +
              ", password='" + password + '\'' +
              '}';
  }
}

三、最终选择交互方式

前端 application/json,上传 josn字符串, 后端 使用对象 或者 Map

前端代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var jsonObj = {"openid":"xxx","username":"Ed sheeran","password":"123"};
   /*
       Jquery默认Content-Type为application/x-www-form-urlencoded类型
    */
   $.ajax({
       type: 'POST',
       url: "/login",
       dataType: "json",
       data: JSON.stringify(jsonObj),
       contentType : "application/json",
       success: function(data) {
           console.log(data)
       },
       error: function() {
           console.log("fucking error")
       }
   });

后端代码1

?
1
2
3
4
5
6
7
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestBody Form form){
      System.err.println(form);
}
}

后端代码2

?
1
2
3
4
5
6
7
8
9
@Controller
public class LoginController {
  @PostMapping("/login")
  public void login(@RequestBody Map<String,Object> map){
      System.err.println(map.get("username"));
      System.err.println(map.get("password"));
      System.err.println(map.get("openid"));
}
}

总结

到此这篇关于SpringBoot前后端json数据交互的文章就介绍到这了,更多相关SpringBoot前后端json数据交互内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Edison_03/article/details/79826656#commentBox

延伸 · 阅读

精彩推荐
  • Java教程Java初学者常问的问题(推荐)

    Java初学者常问的问题(推荐)

    本文介绍一些Java初学者常问的问题,很多朋友对可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区别吗? 声明一个数组为什么需要花费大量时间? 为...

    Java之家4972020-09-03
  • Java教程springboot+log4j.yml配置日志文件的方法

    springboot+log4j.yml配置日志文件的方法

    这篇文章主要介绍了springboot+log4j.yml配置日志文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    3831942511522021-08-05
  • Java教程java控制台实现学生信息管理系统

    java控制台实现学生信息管理系统

    这篇文章主要为大家详细介绍了java控制台实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    qq_454249908592022-07-29
  • Java教程Java多线程 ThreadLocal原理解析

    Java多线程 ThreadLocal原理解析

    这篇文章主要介绍了Java多线程 ThreadLocal原理,ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本,下面文章也...

    冬日毛毛雨11712022-03-05
  • Java教程Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法

    Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法

    这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    养码场00711432021-06-23
  • Java教程Java实现TCP互发消息

    Java实现TCP互发消息

    这篇文章主要为大家详细介绍了Java实现TCP互发消息,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    ~故事的小黄花~7622020-07-29
  • Java教程Java的方法重载与变量作用域简介

    Java的方法重载与变量作用域简介

    这篇文章主要介绍了Java的方法重载与变量作用域,是Java入门学习中的基础知识,需要的朋友可以参考下 ...

    goldensun4252020-01-12
  • Java教程java网络通信技术之简单聊天小程序

    java网络通信技术之简单聊天小程序

    这篇文章主要为大家详细介绍了java网络通信技术之简单聊天小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xlantian7192021-05-20