学习Ajax (概述,应用场景,使用jQury 实现ajax)

news2024/12/26 0:50:42

目录

前言

概述

什么是Ajax?

同步交互与异步交互的区别是什么呢?

应用场景

场景1 在搜索框搜索 资源

场景2 登录业务的对用户名处理

AJAX的优缺点

优点:

缺点:

使用jQury 实现ajax

使用步骤

1 引入jQury 文件

2 使用Ajax 函数

$.ajax()

3 后端服务器,获得请求参数(重点)

那我们下一步学习如何将请求参数传递给后端服务器?

采用键值对的数据格式

采用json 数据格式

那么我们应该在后端servlet怎么获得 请求参数呢?

如果你采用键值对的方式,并且key 是不加双引号的

采用json 数据格式的方式

实例


前言

之前,我们进行前后端交互使用Servlet 中的重定向 和 请求转发 ,实现 前端界面的跳转( 刷新)。但是我们知道,无论是重定向还是请求转发,都是对整个界面的刷新。

这样有个坏处:

  • 请求时间太长
  •  我们希望只是局部进行交互,其他不变

因此本篇博客的核心:1 学习为什么要使用Ajax技术 2 怎么使用Ajax 技术做的局部刷新

 

概述

什么是Ajax?

Ajax是 使用js语言和服务器交互的一门技术。用于前端界面的局部刷新。如做登录业务时,用到的验证码;做搜索业务时,只有搜索框,是通过我们输入的关键词,通过模糊查询查找,整个界面的其他部分不动。

注意:这里的局部刷新,我们引申一个新的词  “ 异步”

同步交互与异步交互的区别是什么呢?

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;

  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

应用场景

场景1 在搜索框搜索 资源

当我们在百度中输入一个“白”字后,会马上出现一个下拉列表!列表中显示的是包含“白”字的关键字。

其实这里就使用了AJAX技术!当文件框发生了输入变化时,浏览器会使用AJAX技术向服务器发送一个请求,查询包含“白”字的关键字,然后服务器会把查询到的结果响应给浏览器,最后浏览器把关键字显示在下拉列表中。

  • 整个过程中页面没有刷新,只是刷新页面中的局部位置而已!

  • 当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应!

场景2 登录业务的对用户名处理

当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为zhangSan的用户是否存在,最终服务器返回true表示名为zhangSan的用户已经存在了,浏览器在得到结果后显示“用户名已被注册!”。

  • 整个过程中页面没有刷新,只是局部刷新了;

  • 在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;

AJAX的优缺点

优点:

  • AJAX使用Javascript技术向服务器发送异步请求;

  • AJAX无须刷新整个页面;

  • 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高;

缺点:

  • AJAX并不适合所有场景,很多时候还是要使用同步交互;

  • AJAX虽然提高了用户体验,但无形中向服务器发送的请求次数增多了,导致服务器压力增大;

  • 因为AJAX是在浏览器中使用Javascript技术完成的,所以还需要处理浏览器兼容性问题;

使用jQury 实现ajax

为什么使用使用jQury 实现ajax?

原因: jQury 是JavaScript 的一个框架,并且这个框架封装好ajax ,当我们要使用Ajax 时,只需要调用专门的方法,就行了。

使用步骤

1 引入jQury 文件

 <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

注意:

引入的jQury 文件 最好是国内的,原因是如果从国外的服务器获得,使用这个jQury 文件速度比较慢

放的位置

script标签在 <head> </head> 中

2 使用Ajax 函数

$.ajax()

注意

  • $.ajax()可以通过发送HTTP请求加载远程数据,是jQuery最底层的AJAX的实现,具有较高灵活性
  • 在 AJAX 请求中,$ 符号通常指的是 jQuery 库的别名。jQuery 是一个非常流行的 JavaScript 库,它简化了 HTML 文档的遍历和操作、事件处理、动画和 Ajax 交互等任务

语法:

$.ajax([设置参数]);

常用设置参数如下:

参 数说 明
String url发送请求的地址,默认为当前页地址
String type请求方式(POST或者GET,默认为GET)
Number timeout设置请求超时时间
Object data 或 String data发送到服务器的数据
String dataType预期服务器返回的数据类型,可用类型有:XML,HTML,Script,JSON,JSONP,Text
function beforeSend(XMLHttpRequest xhr)发送请求前调用的函数参数xhr,可选, XMLHttpRequest对象
function complete(XMLHttpRequest xhr,String ts)请求完成后调用的函数(请求成功或失败时均调用)参数: xhr,可选, XMLHttpRequest对象, ts可选,描述请求类型的字符串
function success(Object result,String ts)请求成功后调用的函数参数result:可选,由服务器返回的数据参数ts可选,描述请求类型的字符串
function error(XMLHttpRequest xhr,String em,Exception e)请求失败时调用的函数参数: xhr,可选, XMLHttpRequest对象, 参数em可选,错误信息参数e:可选 ,捕获的异常对象
boolean global默认为true,表示是否触发全局的AJAX事件

常用的参数:

  • url:请求路径
  • type:请求方式
  • contentType:指定请求体类型,一般和post 请求方式搭配使用
  • data:请求参数
  • dataType :预计响应类型
  • function success(Object result,String ts):请求成功调用success 方法,
  • function error(XMLHttpRequest xhr,String em,Exception e):请求失败调用 error方法

这里大家可以回忆之前学习servlet 时,我们处理前端发来的请求,是不是需要知道,请求参数,请求方式,请求路径。

 样例

    <script>
    function test(){
       let people ='{"name":"dj","password","123"}';
       $.ajax({
           url:"/login",
           //请求路径
           type:"",
           //请求方式 :post /get 默认是get
           data: people,
           //请求参数
           dataType:"json",
           // 预计的响应数据类型
           success:function (data) {
               alert(data)
           }
       })}



</script>

这里没有添加contenType 参数,原因是在本博客中的使用样例,都是比较简单的。如果你没有选择 会采用默认的请求体类型: application/x-www-form-urlencoded; charset=UTF-8 

contentType:"application/json", 的应用场景是 请求体的请求参数是json 格式 的并且比较复杂,就使用。

如果比较简单,就不写,使用默认也不会报错

3 后端服务器,获得请求参数(重点

那我们下一步学习如何将请求参数传递给后端服务器?

重点

  • 请求参数传递服务器Servlet 有两种数据格式
  • 键值对的格式表示
  • json 格式表示【重点掌握】

在之后的学习发现,因为使用键值对,存在局限性,因此对于请求参数,应该使用json 格式的

采用键值对的数据格式

键值对的格式表示,表示请求参数。我们知道键值对是 key-value 的方式

同时我们也要知道采用键值对的方式,其实就是 表示JavaScript中  对象字面量【对象】

因此写法:{ key :value}  或 {"key" value}

大家发现,采用键值对的方式,书写 请求参数,有两种:一个要加双引号,一个不用加双引号。

不使用双引号的键值对虽然也能正确表述 请求请求参数,

但这是有局限性的:

1 key 中存在特殊字符 如 -,*,...等

  • 如 user-name等

2 key 表示具有特殊含义的字符,

  • 如键名如果是class、for等JavaScript的保留字

这两种情况,如果不使用加双引号的是会报错的。

总结

  • 键名未加双引号:在大多数情况下是有效的,但为了避免潜在的语法错误,建议加双引号。
  • 键名加双引号:提高代码的可读性和一致性,特别是在键名包含特殊字符或与JavaScript保留字冲突的情况下
  • 使用键值对的方式,一般只能适用于简单的请求参数,如果是复杂建议使用后面讲的json 数据格式
采用json 数据格式

这里我们要理解 两个词   json 格式的字符串, json 格式对象

格式

json 格式的对象

{" key" :value ,"key1" :value }

json 格式的字符串

'{" key" :value ,"key1" :value }'

注意:value 值可以是 字符串,数组,js对象,基本数据类型表示都可以

发现1

这两者的区别在于, 加了单引号,表示的是字符串。其实在JavaScript中 表示 字符串 除了使用 单引号表示,双引号也可以。但使用双引号 表示时,如果内部同样也使用双引号,那么就会提前结束。因此为了防止出现这个问题,就需要使用转义字符。但很显然使用转义字符会加重我们的负担。

发现2 

我们看见json 格式的对象,其实就是我们之前说的采用键值对表示的JavaScript的对象字面量。我们这里直接就说js 对象。

了解

JavaScript 对象字面量与 JSON 格式的区别?【这个大家了解一下就好】
尽管JavaScript对象字面量和JSON格式在外观上非常相似,但它们之间存在一些重要的区别。以下是它们的主要区别:
1. 键名的引用方式
JavaScript 对象字面量:
键名可以不加双引号,只要它们是有效的JavaScript标识符。
例如:{ name: "张三" }
JSON:
键名必须用双引号括起来。
例如:{ "name": "张三" }
2. 值的类型
JavaScript 对象字面量:
值可以是任何有效的JavaScript数据类型,包括函数、日期、正则表达式等。
例如:{ name: "张三", sayHello: function() { console.log("你好"); } }
JSON:
值只能是字符串、数字、对象、数组、布尔值或 null。
例如:{ "name": "张三", "age": 25 }
3. 函数和日期
JavaScript 对象字面量:
可以包含函数和日期。
例如:{ name: "张三", birthDate: new Date("1990-01-01") }
JSON:
不允许包含函数和日期。
例如:{ "name": "张三", "birthDate": "1990-01-01" }

上面的JavaScript对象字面量,我后面直接就说js 对象。如下图 则是这两种的关系

因此,我后面会将 使用双引号表示的key ,归类为 json 数据格式的,遵循json格式的一些规则。使用键值对格式只将会是不带双引号的key 。帮助理解!!

学习 js 对象和 json 格式的字符串的转换【重点】

JSON.stringify(js对象)

注意:这个方式是将js对象【JavaScript的字面量/json格式的对象,很大程度上 是同一个意思】 转成json 格式的字符串

JSON.parse(json 格式的字符串)

注意:这个方式是将 json 格式的字符串 【我们也可以看作 js 字符串。是一个意思】 转成 js对象

现在我们学会,要想把数据传递给后端服务器,要求数据格式是 键值对/ json 格式

那么我们应该在后端servlet怎么获得 请求参数呢?
如果你采用键值对的方式,并且key 是不加双引号的

后端servlet 

通过调用HttpServletRequest 类型的对象 调用 getParameter( )

一般步骤

  //设置请求编码
        req.setCharacterEncoding("UTF-8");
        //获取请求参数
        String name = req.getParameter(" key");
       // 设置响应编码
        resp.setContentType("text/html; charset=UTF-8");
        //输出 响应内容
        resp.getWriter().println();

使用这种方式传递的请求参数,就像之前所说的局限性很大。即使不是含有特殊字符或是特殊含义的字符,也有可能出现问题,因此使用这种方式,只能是简单的请求参数传递

因此我们一般采用第二种传递方式 使用json 数据格式的方式

采用json 数据格式的方式

我们传递都是json格式的字符串

注意:如果是js对象的话,要通过调用stringify() 参数为js 对象 。转成js 字符串。

步骤

1 通过HttpServletRequest类型调用 getReader() 去读取的传递的请求参数

2 使用集合,还是StringBuffer 或StringBuilder 存储读到Json格式的字符串 

3 解析json 格式的字符串

   3.1 需要使用jar包

如果没有的,可以去maven中央仓库下载,在这里可以找到你需要的jar包

网址:https://mvnrepository.com/

   3.2 调用parseObject (json格式字符串) 或 toJSONString(java 对象)

调用parseObject (json格式字符串)

 static <T> T parseObject(String text, Class<T> clazz)

将json格式的字符串转成 对应的实体类对象

举例

有一个Person 实体类

 使用 FastJSON jar 包的 parseObject 方法将 JSON 字符串转换为 Person 对象
 

  Person person = JSON.parseObject(jsonString, Person.class);

调用toJSONString(java 对象)

static String toJSONString(Object object)

将对应的实体类对象,转成json 格式的字符串

举例

有一个Person 实体类

使用该方法将Person 实体类对象转成字符串

   String jsonString = JSON.toJSONString(new Person());

实例

使用Ajax 技术写一个 用户框,当点击用户输入框 时,发送一个局部请求,把用户输入的用户名,传递给后端会向前端响应一个 “ 你好!”+你输入的用户名的弹框

注意:本实例中使用了 json 格式的字符串,当传递到Servlet 时,需要Json 解析器。

前端代码

<%--
  Created by IntelliJ IDEA.
  User: djbootcdn.net/ajax/
  Date: 2024/12/4
  Time: 下午7:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
用户名<input type="text" id="username"   onclick="test()"  required>
<script>
    function test(){
        let name = document.getElementById("username").value;
        $.ajax({
            url:"/AServlet",
            type:"post",
            data:JSON.stringify({"username":name}),
            dataType:"text",
            success:function (data) {
                    alert(data)
            }
        })
    }

</script>
</body>
</html>

后端代码

package fs.Servlet;

import com.alibaba.fastjson2.JSON;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //获取请求参数
        BufferedReader reader = req.getReader();
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        String name = JSON.parseObject(sb.toString()).getString("username");
        System.out.println(name);
        //输出
        resp.setContentType("text/html; charset=UTF-8");
        resp.getWriter().println("你好," + name);
    }
}

最后结果是成功的,通过我们输入的用户名,会弹出一个 你好+用户名的 弹框。

在这里使用 键值对的方式也是可以成功的

前端代码如下

注意:key 值可以随便设,但不能违背之前说的规则【是特殊含义的字符;包含特殊的符号,;上文使用到的,都不行】

<%--
  Created by IntelliJ IDEA.
  User: djbootcdn.net/ajax/
  Date: 2024/12/4
  Time: 下午7:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

</head>
<body>
用户名<input type="text" id="username"   onclick="test()"  required>
<script>
    function test(){
        let name = document.getElementById("username").value;
        $.ajax({
            url:"/AServlet",
            type:"post",
            data: {name:name},
            dataType:"text",
            success:function (data) {
                    alert(data)
            }
        })
    }

</script>
</body>
</html>

后端代码

package fs.Servlet;

import com.alibaba.fastjson2.JSON;
import fs.entity.Student;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //设置请求编码
        req.setCharacterEncoding("UTF-8");
        //获取请求参数
       String name = req.getParameter("name");
        System.out.println(name);
        //输出
        resp.setContentType("text/html; charset=UTF-8");
        resp.getWriter().println("你好," + name);
    }
}

运行发现,成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]

目录 参考资料&#xff1a; 利用 Boot 选择不同的启动方式&#xff1a; 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM)&#xff1a; 1. Cortex-M 内核芯片——启动原理&#xff1a; 1.1. 启动流程&#xff1a; 1.2. 根据单片机的存储器映射和架构图&#xff1a;启动…

C语言(指针基础2练习)

利用指针变量将一个数组中的数据反向输出。 #include <stdio.h>void rev(int *arr, int size) {int *end arr size - 1;for (int *ptr end; ptr > arr; ptr--){printf("%-3d", *ptr);}printf("\n"); } void get(int arr[], int len) {for (in…

微信小程序web-view 嵌套h5界面 实现文件预览效果

实现方法&#xff1a;(这里我是在小程序里面单独加了一个页面用来下载预览文件) 安装 使用方法请参考文档 npm 安装 npm install weixin-js-sdk import wx from weixin-js-sdk预览 h5界面代码 <u-button click"onclick" type"primary" :loading"…

C—初阶调试

对你有帮助的话能否一键三连啊&#xff01;祝每个人心想事成&#xff01; 什么是Bug? 首先我们先了解一下日常口语中的“Bug”是什么 Bug可以理解为计算机程序错误&#xff0c;编程时的漏洞 调试及重要性 顾名思义&#xff0c;调试就是通过工具找出bug存在&#xff0c;找出…

vs打开unity项目 新建文件后无法自动补全

问题 第一次双击c#文件自动打开vs编辑器的时候能自动补全&#xff0c;再一次在unity中新建c#文件后双击打开发现vs不能自动补全了。每次都要重新打开vs编辑器才能自动补全&#xff0c;导致效率很低&#xff0c;后面发现是没有安装扩展&#xff0c;注意扩展和工具的区别。 解决…

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库&#xff08;非关系型数据库&#xff09;&#xff0c;以文档&#xff08;Document&#xff09;的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…

基于大模型的 AI Agent 技术框架全解析

一、AI Agent 与大语言模型&#xff1a;智能时代的双璧合辉 &#xff08;一&#xff09;AI Agent&#xff1a;智能化浪潮的引领者 在科技迅猛发展的当下&#xff0c;AI Agent 作为一种能够自主感知环境、决策并行动的智能系统&#xff0c;正引领着智能化的新潮流。与传统智能系…

5.ABAP结构体和内表

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 5.1.结构化数据对象 定义 如何引用结构化的数据对象 拷贝 实战练习 创建 拷贝 调试代码 5.2.内表 行类型 键 表种类 存取类型 表类型 如何在本地定义表类型 内表三种可能的…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

泷羽sec-burpsuite(5)app渗透测试(上) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…

量子变分算法---损失函数

引子 关于损失函数&#xff0c;我们知道在强化学习中&#xff0c;会有一个函数&#xff0c;用来表示模型每一次行为的分数&#xff0c;通过最大化得分&#xff0c;建立一个正反馈机制&#xff0c;若模型为最优则加分最多&#xff0c;若决策不佳则加很少分或者扣分。而在神经网络…

车间的图纸在传输过程的安全怎么保障?

车间的图纸在传输过程的安全保障&#xff0c;要从很多方面出发分析&#xff0c;本文从以下几点为大家列出几个&#xff0c;看看有没有你想知道的呢~ 1、采用先进的图纸加密软件 采用先进的加密算法对图纸进行加密处理&#xff0c;确保图纸文件在存储、传输和使用过程中的安全性…

MQTT消息服务器mosquitto介绍及说明

Mosquitto是一个开源的消息代理软件&#xff0c;支持MQTT协议&#xff08;消息队列遥测传输协议&#xff09;。MQTT是一种轻量级的发布/订阅消息传输协议&#xff0c;专为低带宽、不可靠网络环境下的物联网设备通信而设计。以下是关于Mosquitto服务器的一些介绍和说明&#xff…

想在iPad上远程操作安卓手机的APP,怎样实现iPad远程控制安卓?

学生党或互联网行业的打工人&#xff0c;人手连三台电子设备也很常见&#xff0c;手机、平板还有笔记本电脑一大堆&#xff0c;如果出门要全带上&#xff0c;背包压力也变大。 有没有想过用远程控制功能&#xff0c;让iPad远程控制安卓手机&#xff1f;这样做&#xff0c;出门就…

VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Spring源码分析之Bean的实例化(createBeanInstance())

前言: 通过Spring源码分析之Bean的创建过程(createBean)-CSDN博客我们可以知道如果没有动态代理以及循环依赖的前提之下的话那么一个普通的单例Bean的创建后就是实例化,属性填充,初始化这三个步骤那么这篇文章的话我们就先说一下实例化也就是doCreateBean方法里面的createBeanI…

一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程

一、现象 okhttp调用某个服务&#xff0c;如果第二次访问间隔上一次访问时间超过60s&#xff0c;返回错误&#xff1a;"unexpected end of stream"。 二、最终定位原因&#xff1a; 空闲连接如果超过60秒&#xff0c;服务端会主动关闭连接。此时客户端恰巧访问了这…