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

前后端交互常见的几种数据传输格式 form表单+get请求 form表单+post请求 json键值对格式

目录

1. get请求 query string

2.form表单+get请求

3..form表单+post请求

4..json格式

5.总结


1. get请求 query string

前端通过get请求携带 query string(键值对) ,后端通过req.getParameter(key)方法获取数据。如果key不存在,获取到的就是null。querystring 会被 Tomcat 处理成形如Map这样的结构,就可以通过key获取value了。这种是直接在地址栏里输入querystring: ?username=lisi&password=123

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");resp.setContentType("text/html;charset=utf8");resp.getWriter().write("username="+username+" password="+password);}


2.form表单+get请求

和上面差不多,一个是以get方式在地址栏手写querystring,这个是通过form表单构造get请求,同样也是在传querystring。可以看到get请求会将数据显示在地址栏上。

后端

@WebServlet("/test")
public class test extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");resp.setContentType("text/html;charset=utf8");resp.getWriter().write("我是响应数据");}
}

前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="test" method="get"><input type="text" name="username"><input type="text" name="password"><input type="submit"></form>
</body>
</html>

后端通过前端name属性所对应的字符串获取到输入的数据。

通过fiddler抓包可以看到get请求请求的数据被拼接到了URL后面,后端我通过resp.getWriter().writer()进行响应,响应数据是在body中被传回来的。


3..form表单+post请

请求在body中被传过去,不会显示在地址栏上。同样使用getParameter方法可以获取到value。通过前端name属性所对应的字符串获取到输入的数据。

后端

@WebServlet("/test")
public class test extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");resp.setContentType("text/html;charset=utf8");resp.getWriter().write("我是响应数据");}
}

前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="test" method="post"><input type="text" name="username"><input type="text" name="password"><input type="submit"></form>
</body>
</html>

通过抓包可以看到,post请求的数据不会被拼接到URL后面,而是通过存在在body中传过去的。 

响应数据还是在body中传回来的。这就是人们所说的post请求安全,get请求不安全。


4..json格式

json是一种键值对结构的数据格式。通过请求或响应的body中传递。

格式:

{

        username: lisi,

        password: 123

或嵌套:

{

          {

                username: zhangsan,

                password: 666

          }      

          {

                username: lihiai,

                password: 456

          }

}

其实在数据传输前,我们程序员自己手动写代码也能构造这种json格式的字符串,但这样效率不高。我们可以使用jackson这样的第三方库,这样只需要要往它的方法中传一个对象,它就能返回一个构造好的json格式的字符串,往它的方法中传一个json格式的字符串,他也能返回一个对象。在maven中央仓库中搜索jackson。

  • 首先创建jackson的实例对象

ObjectMapper mapper = new ObjectMapper();   ObjectMapper 对象映射器

  • Servlet中将一个对象转成json格式的字符串

String respJson = mapper.writeValueAsString(users);

  • Servlet中将多个对象转成json格式的字符串 前提是多个对象在LIst集合中

String respJson = mapper.writeValueAsString(list);

  • servlet中将json格式的字符串转成一个对象

User user = mapper.readValue(req.getInputStream(), User.class);

  1. 通过第一个参数先从body中以字节为单位读取出json格式的字符串;
  2. 通过第二个参数 创建User实例;
  3. 解析json格式的字符串 并转换成map键值对结构;
  4. 对map的key进行遍历与实例的属性名进行匹配 匹配成功后就会把map的value赋值给该实例的属性;
  5. 返回该实例。

  • Ajax构造请求数据时将一个JS对象转成json格式的字符串

let jsonReq = JSON.stringify(body);

举个例子: 

    <script>/*获取数据*/let inputs = document.querySelectorAll('input');/*获取按钮元素*/let button = document.querySelector('#submit');button.onclick = function () {/*判断数据*/let fromUser = inputs[0].value;let toUser = inputs[1].value;let message = inputs[2].value;if(fromUser=="" || toUser=="" || message=="") {alert("内容不能为空!");return;}/*构造JS对象*/let body = {"fromUser": fromUser,"toUser": toUser,"message": message};//通过stringify方法将JS对象转成json字符串let jsonStr = JSON.stringify(body);$.ajax({type: 'post',url: 'message',contentType: 'application/json;charset=utf8',data:jsonStr,success: function (body) {alert("发送成功!");}});/*发送成功后输入框清空*/for (let input of inputs) {input.value = "";}   }</script>

或直接在你的项目的pom.xml中加入下面这段代码,再刷新即可:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency>
public class test extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper mapper = new ObjectMapper();/*第一种处理方式*/// 是把请求中的json格式的数据转成一个对象Users users1 = mapper.readValue(req.getInputStream(), Users.class);// 1.通过第一个参数先从body中以字节为单位读取出json格式的字符串// 2.通过第二个参数 创建Users实例// 3.解析json格式的字符串 并转换成map键值对结构// 4.对map的key进行遍历与实例的属性名进行匹配 匹配成功后就会把map的value赋值给该实例的属性。// 5.返回该实例/*第二种处理方式*/// 这里的user是一个实例对象// 将该对象转成json格式的字符串String respJson = mapper.writeValueAsString(users);resp.setContentType("application/json;charset=utf8");resp.getWriter().write(respJson);}
}

5.总结

前端通过form表单将请求提交到tomcat服务器,Tomcat接收到请求之后,解析该请求,会把这个请求的方法,URL,版本号,各种header,body啥的都解析出来,构造成req对象(这里面就存着该请求的相关数据,通过它里面的已有的各种方法可以获取到)和resp象。 Tomcat通过请求中的url和请求方法选择并调用我们自己写的继承自HttpServlet的类的doPost方法或doGet方法等等,我们需要重写方法。最后通过resp对象包装响应数据数据返回给Tomcat,tomcat发送给浏览器。

相关文章:

  • 远程运维用什么软件?可以保障更安全?
  • Visual Studio 2019光标变成灰色方块问题
  • python使用selenium做自动化,最新版Chrome与chromedriver不兼容
  • Android 10.0 系统默认打开OEM解锁开关功能实现
  • V90伺服 EPOS模式下回原(详细配置+SCL源代码)
  • rust变量绑定、拷贝、转移、引用
  • Jakarta-JVM篇
  • 【python海洋专题四十三】海洋指数画法--单色渐变柱状图
  • SpringDataJpa(三)
  • 【pytest】html报告修改和汉化
  • ubuntu20.04下apache启用php7.4-fpm
  • 嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能
  • 2311C++抽象工厂
  • Gorm 中的钩子和回调
  • SpringCloud——服务注册——Zookeeper
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Android优雅地处理按钮重复点击
  • CSS3 变换
  • Git初体验
  • input实现文字超出省略号功能
  • k8s如何管理Pod
  • Material Design
  • Netty源码解析1-Buffer
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 7 修改了什么呢 -- 2
  • Spring-boot 启动时碰到的错误
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 多线程事务回滚
  • 机器学习学习笔记一
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊directory traversal attack
  • 前端相关框架总和
  • 深入 Nginx 之配置篇
  • PostgreSQL之连接数修改
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (8)STL算法之替换
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (十三)Maven插件解析运行机制
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)Linq学习笔记
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转载)利用webkit抓取动态网页和链接
  • ***通过什么方式***网吧
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(三):变量声明、设置、拼接、截取