当前位置: 首页 > news >正文

前端与后端传递数据 — — JSON

前端与后端传递数据 — — JSON

1 前端传送JSON数据给后端

1.1 application/x-www-form-urlencoded默认格式

在这里插入图片描述

1.1.1 通过HttpServletRequest获取数据

/**
  * 通过request获取数据
  * @param request
  * @return
  */
 @PostMapping("/testDefaultWithNoAnno1")
 public String testDefaultWithNoAnno1(HttpServletRequest request){
     String name = request.getParameter("name");
     System.out.println("str>>>" + name);
     return "testDefaultWithNoAnno1 success";
 }

1.1.2 通过实体类获取数据

 /**
  * 通过实体类获取[Pojo]
  * @param user
  * @return
  */
 @PostMapping("/testDefaultWithNoAnno2")
 public String testDefaultWithNoAnno1(User user){
     System.out.println(user.getName() + "  " + user.getAge());
     return "testDefaultWithNoAnno2 success";
 }

1.1.3 通过@RequestParam+Map获取

 /**
  * 通过Map方式+@RequestParam注解
  * @param map
  * @return
  */
 @PostMapping("/testDefaultByAnno1")
 public String testDefaultByAnno(@RequestParam Map<String, Object> map){
     String name = (String) map.get("name");
     System.out.println("name>>>" + name);
     return "testDefaultByAnno1 success";
 }

1.1.4 总结

RequestMapPojo
不加注解×
@RequestParam××
@ResponseBody×××

1.2 application/json格式

注意:一般来说要通过body传送数据是使用POST方式,此处为了简单,暂用GET方式

1.2.1 传送普通字符串

@GetMapping("testJsonByStr")
public String testJSONByStr(@RequestBody String str){
    System.out.println("str>>>" + str);
    return "testJsonByStr success";
}
  • postman测试
    在这里插入图片描述
  • 最后结果:
    在这里插入图片描述

1.2.2 传送json数组

@GetMapping("/testJsonByArr")
public String testJSONByArr(@RequestBody List<String> list){
    for(String str : list){
        System.out.println("str>>>" + str);
    }
    return "testJsonByArr success";
}
  • postman发起测试:
    在这里插入图片描述

  • 最后结果:
    在这里插入图片描述

1.2.3 传送json对象

//Json对象
@GetMapping("/testJsonByObj")
public String testJSONByObj(@RequestBody User user){
    System.out.println(user);
    System.out.println("name>>>" + user.getName());
    System.out.println("age>>>" + user.getAge());
    return "testJsonByObj success";
}

User对象(一定要有get方法):

@Data
public class User {
    private String name;
    private Integer age;
}

postman发起请求:
在这里插入图片描述
控制台消息:

User(name=张三, age=22)
name>>>张三
age>>>22

1.2.4 传送json对象数组

//Json对象数组
@GetMapping("/testJsonByObjArr")
public String testJsonByObjArr(@RequestBody List<User> userList){
    for(User user : userList){
        System.out.print("name>>>" + user.getName() + "   ");
        System.out.println("age>>>" + user.getAge());
    }
    return "testJsonByObjArr success";
}

postman发起请求:
在这里插入图片描述

控制台消息:

name>>>zhangsan   age>>>23
name>>>lisi   age>>>15

1.2.5 前端的复杂请求

①编写接收类
ReqDTO

@Data
public class ReqDTO {
    private List<String> busType;
    private List<Integer> orderStatus;
    private List<String> userIds;
    //@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")一般来说也可以,但是需要精确到小时【GTM 八小时时差】
    //因此使用jackson
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startDate;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endDate;
    private Integer start;
    private Integer limit;
}

②编写controller接收

@GetMapping("/testJsonByComplex")
public String testJsonByMap(@RequestBody List<ReqDTO> list){
    ReqDTO reqDTO = list.get(0);
    //busType
    List<String> busType = reqDTO.getBusType();
    for(String str : busType){
        System.out.println(str + "  ");
    }
    //orderStatus
    List<Integer> orderStatus = reqDTO.getOrderStatus();
    for(Integer i : orderStatus){
        System.out.println(i + "   ");
    }
    //userIds
    List<String> userIds = reqDTO.getUserIds();
    for(String id : userIds ){
        System.out.println(id + "    ");
    }
    //startDate
    Date startDate = reqDTO.getStartDate();
    System.out.println(startDate);
    //endDate
    Date endDate = reqDTO.getEndDate();
    System.out.println(endDate);
    //start
    Integer start = reqDTO.getStart();
    System.out.println(start);
    //limit
    Integer limit = reqDTO.getLimit();
    System.out.println(limit);
    return "testJsonByComplex success";
}

③postman发起请求:
在这里插入图片描述
④控制台结果:

appoint  
outpatient  
0   
1   
2   
11    
21    
31    
Sun Jun 20 11:43:11 CST 2021
Thu Jul 21 12:23:34 CST 2022
0
10

拓展【格式化时间的其他方式】:

private String startDate;

private String endDate;

"---------------------------------------------"
//格式化startDate
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime startDate = LocalDateTime.parse(reqDTO.getStartDate(), formatter);
System.out.println(startDate);
//endDate
LocalDateTime endDate = LocalDateTime.parse(reqDTO.getEndDate(), formatter);
System.out.println(endDate);
//start
Integer start = reqDTO.getStart();
System.out.println(start);

2 后端给前端传送JSON数据

①构建数据对象
User:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
}

②构建方法,返回数据

@RestController
public class JSONController {
	@GetMapping("/backToFront")
	public Map<String, Object> backToFront(@RequestBody String test){
	    Map<String, Object> result = new HashMap<>();
	    result.put("msg", "查询成功");
	    result.put("code", 200);
	    //构建数据列表
	    List<User> userList = new ArrayList<>();
	    User user1 = new User("C罗", 26);
	    User user2 = new User("梅西", 25);
	    userList.add(user1);
	    userList.add(user2);
	    result.put("data", userList);
	    return result;
	}
}

③postman发起请求,查看响应结果
在这里插入图片描述

  • 如果前端传递的是:{“userId”:“zhangwei”,“groupId”:131,“userOrder”:30} 后端用String接收,然后JSONObject.parse(),就可以转化为JSONObject了

  • 如果前端传递的是:[{“groupId”:1,“userOrder”:1},{“userId”:“a’s’d”,“groupId”:1,“userOrder”:2}] 后端也用String接收,然后JSONArray.parseArray(),就可以转换成JSONArray了

3 详述 application/json 与Content-Type关系

首先,application/json是Content-Type的一种。

Content-Type:在HTTP的请求头中,可以使用Content-type来指定上传参数不同格式的请求信息。

get方法:在url中说明情请求的资源,比如https://www.baidu.com/com?from=self&name=xx 其中?后的数据就是请求的数据,并且连接用&,get方法也可以提交表单数据,但是提交的数据在url中,其他人可以通过查看历史记录中的url来获取你提交的数据,这样很不安全.


post方法:传输数据不在url中,而在数据段中出现,并且请求头多了Content-Type 和 Content-Length,post提交表单数据的时候比get方法更安全.

Content-Type类型:

  • application/x-www-form-urlencoded,key&value形式,所有浏览器都支持,但是后端解析麻烦

application/x-www-form-urlencoded是默认的请求头,其ajax的请求数据格式是json

  • application/json,json串形式JavaScript Object Notation,后端解析简单,但部分浏览器不支持
  • multipart/form-data,主要用于文件上传,将文件转成二进制数据进行传输,不涉及转码
  • text/plain,是使用纯文本进行传输,平时用的很少

参考文章:https://blog.csdn.net/weixin_40599109/article/details/113614103

相关文章:

  • CANoe/CAPL ,QQ消息远程通知
  • 3D 视觉算法初学概述
  • 特征点检测和特征点匹配(ORB)
  • MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
  • 【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?
  • REACT全家桶(1)
  • 对Spring的后置处理器BeanPostProcessor的使用
  • 【day9】【洛谷算法题】-P2433小学数学N合一-刷题反思集[入门2分支结构]
  • halcon脚本-深度学习【目标检测】
  • 线上服务器内存飙升怎么排查?
  • xss-lab通关之路
  • FPGA手写一个动态方块视频,用来代替摄像头输入,私信我送代码
  • 海思3559万能平台搭建:DDR移植的一些问题
  • Baklib知识分享|制作网站FAQ需要注意哪些内容?
  • 第十四届蓝桥杯备赛模板题——蓝桥部队 (带权并查集)
  • 【刷算法】求1+2+3+...+n
  • Android优雅地处理按钮重复点击
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Cumulo 的 ClojureScript 模块已经成型
  • ES10 特性的完整指南
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux各目录及每个目录的详细介绍
  • PHP CLI应用的调试原理
  • Quartz初级教程
  • VUE es6技巧写法(持续更新中~~~)
  • 基于axios的vue插件,让http请求更简单
  • 目录与文件属性:编写ls
  • 前言-如何学习区块链
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 什么是Javascript函数节流?
  • 使用common-codec进行md5加密
  • 用mpvue开发微信小程序
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 如何正确理解,内页权重高于首页?
  • #LLM入门|Prompt#3.3_存储_Memory
  • #vue3 实现前端下载excel文件模板功能
  • $(selector).each()和$.each()的区别
  • (1)Android开发优化---------UI优化
  • (3)nginx 配置(nginx.conf)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (zhuan) 一些RL的文献(及笔记)
  • (第一天)包装对象、作用域、创建对象
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)ABI是什么
  • .net core 6 redis操作类
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net IOC框架入门之一 Unity
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET面试题(二)
  • .NET中统一的存储过程调用方法(收藏)
  • @Documented注解的作用