HTTP协议(JavaEE初阶系列15)

目录

前言:

1.HTTP协议

1.1HTTP协议是什么

1.2HTTP协议的报文格式

1.2.1抓包工具的使用

1.2.2HTTP请求

1.2.3HTTP响应

2.HTTP请求

2.1首行的组成

2.2.1URL的组成

2.2认识“方法”(method)

2.2.1GET方法

2.2.2POST方法

2.2.3GET和POST请求的区别

2.3认识请求“报头”(header)

2.4认识请求正文(body)

3.HTTP响应

3.1认识“状态码”

3.2HTTP请求的构造

3.2.1直接构造

3.2.2html中的特殊标签

3.2.3通过form表单构造http请求

3.2.4通过ajax构造

3.2.5通过postman构造

4.HTTPS

4.1HTTPS是什么

4.2HTTPS的工作过程

4.2.1使用对称密钥

4.2.2引入非对称加密

4.2.3引入证书

4.2.4完整流程

4.2.5总结

4.2.6HTTPSvsHTTP

结束语:


前言:

在之前的博客中小编给大家简单的介绍了一下有关于HTTP协议的东西,他是属于应用层的一个广泛使用的协议,再应用层中主要关注的是数据怎么使用。应用层协议是经常需要“自定义”的但是很多时候也不一定要从0开始设定,我们也可以基于大佬们设计好的协议,在这个基础上进行设定。这个协议就是HTTP,HTTP的应用非常广泛,他之所以这么广泛就是因为HTTP的可制定性非常强。那么我们在什么时候可以用到HTTP协议呢?只要我们在上网的时候就会使用到HTTP协议,比如浏览器打开一个网页,手机APP从网络上加载一份数据,微信小程序,支付宝小程序,打开游戏...都是在使用HTTP协议。所以接下来就和小编一起来学习一下HTTP协议吧!

1.HTTP协议

1.1HTTP协议是什么

HTTP的全称是“超文本传输协议”,是一种应用非常广泛的应用层协议。他是一种“一问一答”这种形式的协议,一个请求对应一个响应。HTTP往往是基于传输层的TCP协议实现的,目前我们主要使用的是HTTP1.1。

1.2HTTP协议的报文格式

想要仍是报文格式,就需要借助一些外部工具来把http协议给显示出来。这里就涉及到了“抓包工具”,抓包工具本质上相当于一个“代理”,借助这样的代理就可以看到网络上传输的具体数据了。在网上有很多抓包工具其中Chrome就内置了抓包工具,还有wireshark这里的功能更加复杂也更加全面,但是小编这里给大家介绍的是fiddler,它一般是只专注于http,所以使用起来比较简单方便。大家可以自己去网上下载一个,下面小编就直接进入fiddler使用的演示了。

1.2.1抓包工具的使用

①fiddler主页面的展示:

②在界面中左侧是抓到包的列表,当双击要关注的包的时候,右侧就会显示详情,右上是请求,右下是响应。 

我们按照下面的操作就可以直接打开了。这里点击Raw就是最原始的http请求的数据。

上面就是一个完整的http请求,所谓的http请求其实就是通过代码构造出一个HTTP格式要求的字符串,在往TCP的socket中写就可以了。

1.2.2HTTP请求

一个http请求数据,包含了4个部分。

注意在空行后面可能还会有正文,但是有的时候可以没有正文。

1.2.3HTTP响应

有的同学的响应可能是下面的这种二进制的,不影响我们只要点击上面的那一串就可以将其转换成文本格式的了。

你会发现这里的正文就是html代码,HTTP响应就是要显示的html的本体,浏览器拿到这个http响应也就拿到了里面的html就可以显示了。

这里我们借助了抓包工具fiddler,就看到了HTTP协议的请求和响应的详细内容了,具体细节如下所示:

下面我们就一一来看一下HTTP里面的具体内容吧。

2.HTTP请求

2.1首行的组成

如上面抓包的那个首行所示:

其中HTTP方法描述了这个方法想要干什么,HTTP方法有很多种,不同的方法,表示的“语义”不同。下面会给大家一一介绍的。

URL是唯一资源定位符,它描述了网络上的唯一的一个资源。

版本号就是我们现在使用的HTPP的版本。

2.2.1URL的组成

针对URL来说大概是由一下这几个部分组成。

比如现在有一家餐厅,如果你要点外卖的话就会有以下的信息。

大家可以对应上述的情况来理解一下。 

2.2认识“方法”(method)

在HTTP中有以下几种方法。

方法说明
GET获取资源
POST传输实体主体
PUT传输文件
HEAD获得报文首部
DELETE删除文件
OPTIONS询问支持的方法
TRACE追踪路径
CONNECT要求用隧道协议连接代理
LINK建立和资源之间的联系
UNLINE断开连接关系

上述的这么多种方法我们最常见到的就是get和post请求,所以接下来我们来详细的看一下这两个方法。

2.2.1GET方法

GET的语义是“从服务器这里拿取数据”。我们一般看到的请求都是GET请求。

如上述我们在搜索“搜狗”的时候,我们使用fiddler抓包抓到的也是GET请求。

GET请求的特点:

  • 首行的第一个部分为GET。
  • URL的query string可以为空,也可以不为空。
  • header部分有若干个键值对结构。
  • body部分为空。

2.2.2POST方法

POST方法的语义是“往服务器里提交东西”,这个一般是在登录的时候或者是在上传文件的时候会出现POST请求,比如我们现在登录一下一个网站,然后使用fiddler进行抓包。

并且在POST请求中body一般不为空。

2.2.3GET和POST请求的区别

首先GET和POST是没没有本质区别的,使用GET场景换成POST一般也是可以的,但是在使用习惯上存在区别:

  • 数据的传输方式:GET请求的数据是通过URL传递的,即将数据拼接到URL的后面,以?分隔,参数之间以&符号分隔。因此GET传输的数据受限制的,通常在几千个字符之内。而POST请求则是将数据放在HTTP请求的请求体中进行传输,没有大小的限制,可以传输较大的数据量。
  • 数据传输安全性:GET请求传输的数据是明文的,因此数据容易被拦截和篡改。而POST请求传输的数据放在请求体中,所以相对安全一些。
  • 缓存:GET请求是可以被缓存的,当浏览器再次请求同一个URL时,可以从缓存中直接获取数据,加快访问速度。而POST请求是不可以缓存的,因为每次提交数据都可能导致服务器状态的改变。
  • 安全性:GET请求的数据会被浏览器保存在历史记录和服务器日志中,容易被恶意程序利用。而POST不会被保存在历史记录和服务器日志中,相对更加安全。

2.3认识请求“报头”(header)

头部是以键值对的结构组织的,每一个键值对占一行,键和值之间使用冒号分隔,这里的键值对可有N行,最后会用空行作为结束标记的。

如下所示:

header中的键值对大多都是HTTP协议规定的,当然这里也可以添加自定义的键值对。

  • Host:其中第一个属性 描述了浏览器这个请求要访问的服务器是谁,这里也可以写端口号。大多数情况下host和url是一致的,但是如果当前的服务器不是直接访问的而是通过“代理”访问的此时url和host可能就会不一样了。
  • Content-Length:描述了body的长度。如下所示:
  • Content-Type:描述了body数据格式。如下所示:

在上述中我们可以看到他是以json的形式来组织的,json使用{}表示的,这里面包含了若干个键值对,键值对之间使用分隔,键和值之间使用分隔。如下所示:

在content-type中还有一些其他的写法比如:text/html,text/css,application/javascript,image/jpg,image/png......

  • User-Agent:简称UA,它表示浏览器/操作系统的属性。如下所示:

这里面就描述了他是Windows NT 10.0的操作系统,64位,并且后面还描述了浏览器的版本。 

  • Referer:描述了当前这个页面,从哪个页面跳转来的。

  • Cookie:它是浏览器本地存储数据的一种机制,Cookie中存储了一个字符串,这个数据可能是客户端自行通过JS写入的,也可能来自于服务器。它的本质是浏览器在本地存储用户自定义数据的一种关键机制。他也是通过键值对的形式组织的,键值对之间使用;分隔,键和值之间使用=分隔。

如上所示就是我们在使用fiddler来进行抓到的Cookie。他存储的是字符串,一般是存储用户的身份信息,由于客户端有很多,每个客户端提供的服务可能不一样,因此服务器就可以通过Cookie来进行区分,比如客户端在登录时候,服务器就识别好客户端的角色,把角色信息返回给浏览器,然后保存在Cookie中,后续客户端在访问的时候,就会带着这个Cookie,然后服务器就直接返回数据给客户端。

2.4认识请求正文(body)

我们来使用fiddler进行抓包就可以看到正文了。

3.HTTP响应

3.1认识“状态码”

状态码表示访问一个页面的结果(是成功还是失败,还是其他的一些情况....)在http中提供的状态码是非常复杂繁多的,我们看一下下面的这些状态码。

上面这些虽然有很多,但是会发现大概被分成了以下几大类:

类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码) 需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

而这五大类中又包含了很多具体的状态码。具体的我们来看一下以下的这几个。

  • 200:表示的是请求成功。
  • 301:Moved Permanently,表示永久重定向,以后打开都重定向。
  • 302:Move temporarily,临时重定向,但是下次会不会要进行重定向这个是不确定的。
  • 403:Forbidden,访问被拒绝。
  • 404:Not Found,表示要访问的资源不存在。
  • 418:菜单
  • 500:Internal Server Error,服务器内部错误。
  • 504:Gatway Timeout,表示服务器访问超时了。浏览器给服务器请求,服务器要返回响应,结果服务器迟迟没有响应。

3.2HTTP请求的构造

3.2.1直接构造

我们可以直接在浏览器的地址栏中国输入一个url来构造出一个GET请求。

3.2.2html中的特殊标签

在html中一些特殊标签也会触发GET请求。比如:link、script、img、a。

3.2.3通过form表单构造http请求

form表单构造出来的GET请求,这里我们借助抓包工具来给大家展示,如下图所示:

form表单构造出来的POST请求,这里我们借助抓包工具来给大家展示,如下图所示:

注意:form只支持get和post。

3.2.4通过ajax构造

在js中提供了原生的ajax的api,但是这里我们使用的是jQuery中提供的ajax的api。下面我们来给大家来实现一下吧。

①打开jQuery的官网☞https://releases.jquery.com/

②复制下面的路径到代码中。注意这里可以先自己进行访问一下,确保这个地址可以进行访问。

 如果上述的地址打开的页面是下面的这种情况就说明可以正确访问到。

引入到代码中。

③明确$符号的含义。

$:在jQuery中是一个特殊的全局变量。jQuery中的各种的api都是$的方法。你也可以直接使用jQuery和$是一样的。

上述的body是响应的正文,function是一个回调函数,会在服务器中返回一个正确的响应的时候,

会被浏览器自动执行,这个执行过程就是“异步”,在我们页面的js中把请求发送出去之后就不用管了,就会继续执行后续的代码,直到响应回来之后传给代码。

相比于form来说ajax的功能比form更加丰富,更加灵活。

下面我们来运行一下代码。

代码展示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ajax示例</title><script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
</head>
<body><script>$.ajax({url:"https://www.soguo.com",type:"get",//这里可以写GET,POST...大写或者是小写都可以data:"这个是body",contentType:"text/plain",success:function(body){//这里写处理响应的代码console.log(body);}});</script>
</body>
</html>


结果展示:

我们可以看到在这个运行结果中前端的控制台中出现了红色的子,注意这并不是bug,而是Ajax中的一个典型的跨域问题,现在运行的Ajax代码的页面域名是abc.com但是在Ajax的请求中访问的域名是def.com,这两域名不一致的话哪怕服务器给你响应了数据,浏览器还是不能处理,还是要报错。在后面只要咱们自己写了服务器,自己的页面来请求自己的服务器,自然这里就不会存在这个跨域问题了。

3.2.5通过postman构造

上述的这些都是需要进行代码来进行构造的,是否有办法可以不写代码来构造请求呢?有一些现成的工具,可以直接构造出HTTP请求,例如postman。网址☞https://www.postman.com/

①进入到官网之后,我们切换到workspace。

② 进行注册使用,并打开界面。

③创建一个标签页,点击+号即可创建。

 

④构造一个请求。

 在侧边栏中也可以构造其他请求。

这样就可以构建好请求了。

4.HTTPS

4.1HTTPS是什么

HTTPS(Hyper Text Transfer Protocol Secure,安全的超文本传输协议)是一种基于SSL/TSL协议的HTTPS协议,他是HTTP协议的安全版本。HTTPS协议通过加密通信内容和身份验证来保证数据传输的安全和完整性,从而可以有效的防止数据在传输的过程中被窃取或篡改。

你可以理解为HTTPS=HTTP + 加密 + 认证 + 完整性保护

那么什么是加密,什么又是解密呢?

  • 加密就是把明文进行一系列的变换生成密文。
  • 解密就是把密文再进行一系列的变换,还原成明文。
  • 加密就是针对HTTP的各种header和body。

在加密中主要是有两种模式,一种是使用堆堆对称密钥,另一种是使用非对称密钥进行加密。下面我们来分别看下两种加密模式。

4.2HTTPS的工作过程

4.2.1使用对称密钥

原理:对称加密其实就是通过同一个“密钥”,把明文加密成密文,并且也能把密文解密成明文。

那么这个密钥是怎么保证客户端和服务端两者之间是一致的呢?

在客户端传输数据的时候是需要加密的,此时客户端就会自己生成一个密钥,那么在通过网络然后传输给服务端。既如此那么也就说明黑客也是可以拿到这里的key的。所以这里就会存在一些安全问题,如下图所示:

4.2.2引入非对称加密

那么针对上述的不安全情况下,我们就引入了另一种机制,非对称加密的机制。客户端希望把自己的key安全的传给服务器不被黑客拿到,那么此时我们就可以使用非对称密钥来进行加密操作。

 

由于这里黑客拿不到pri私钥,无法对密文进行解密,所以黑客就无法对密文的数据进行解析和篡改了。这样使用非对称密钥就达到了一个安全的保证机制。

4.2.3引入证书

当然安全是相对的,黑客也不是吃素的,黑客会通过偷袭的方式来进行篡改数据。如下所示。

以上就会将非对称密钥变得不安全了。那么它攻击的原理就是要让客户端能够信任公钥。那么该怎么让客户端相信这里的公钥呢?这里我们就需要引入一个证书的概念。我们继续往下来看。

4.2.4完整流程

 

这里向大家解释两个概念:

证书:它像是一个结构化的字符串,里面包含了以下信息(证书的发放机构、证书有效期、公钥、证书所有者、签名....)

校验:当客户端获取到这个证书之后就会对该证书进行一个校验,辨别一下真伪。具体操作如下所示。

  1. 得到初始的签名:客户端使用系统中内置的权威机构的公钥pub2,针对上述证书中的加密签名进行解密,得到一个初始签名(这个签名是权威机构计算出来的,假设为sum1)。
  2. 计算现在的签名:客户端使用同样的签名计算算法,基于证书中的属性重新计算,得到sum2.
  3. 比较两个签名是否相同:如果相同就说明证书中的数据都是未被修改过的,如果签名不同就说明证书中的数据是被修改过的,客户端就会有浏览器弹窗提醒。

4.2.5总结

HTTPS工作过程涉及到的密钥有三组。

  • 第一组(非对称加密):用于校验证书是否被篡改,服务器持有私钥(私钥在注册证书时或得),客户端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥),服务器使用这个私钥对证书的签名进行加密,客户端通过这个公钥解密获取到证书的签名,从而校验证书是否被修改过。
  • 第二组(非对称加密):用于协商生成对称加密的密钥,服务器生成这组私钥-公钥对,然后通过证书把公钥传递给客户端,然后客户端用这个公钥给生成的对称加密的密钥加密,传出给服务器,服务器通过私钥解密获取到对称加密密钥。
  • 第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。

4.2.6HTTPSvsHTTP

HTTPS协议与HTTP协议的区别在于HTTPS协议再数据传输的过程中使用了SSL/TLS协议进行加密和身份验证,另外关于它们两个的默认端口号也是不同的,HTTP的默认端口号是80,而HTTPS默认端口号是443。

结束语:

这节中小编主要是给大家分享了有关于HTTP和HTTPS协议的一些具体内容,希望这节对大家了解HTTP协议有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm-运行时数据区概述及线程

1.运行时数据区内部结构 不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机的启动而创建&#xff0c;随着虚拟机的退出而销毁&#xff0c;另外一些则是与线程一一对应的&…

【算法刷题之链表篇(1)】

目录 1.leetcode-82. 删除排序链表中的重复元素 II&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;方法及思路&#xff08;一次遍历&#xff09;&#xff08;3&#xff09;代码实现 2.leetcode-19. 删除链表的倒数第 N 个结点&#xff08;1&#xff09;题目描述&a…

测试平台metersphere

metersphere可以做接口测试、UI测试、性能测试。 metersphere接口测试底层是jmeter&#xff0c;可以做API管理&#xff0c;快捷调试&#xff0c;接口用例管理&#xff0c;接口自动化场景执行一键选取用例范围&#xff0c;生成测试报告。 会用jmeter&#xff0c;metersphere会…

小程序数据可视化:使用图表和可视化工具展示数据

在当今信息爆炸的时代&#xff0c;数据无疑是最珍贵的资源之一。然而&#xff0c;海量的数据如果不加以整理和展示&#xff0c;很难从中获取有价值的信息。这时候&#xff0c;数据可视化就发挥了重要作用&#xff0c;它能够通过图表和可视化工具将复杂的数据转化为直观的视觉形…

《Java极简设计模式》第04章:建造者模式(Builder)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

ssm+Vue.js在线购物系统源码和论文

ssmVue.js在线购物系统源码和论文049 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势…

手机直播源码开发,协议讨论篇(三):RTMP实时消息传输协议

实时消息传输协议RTMP简介 RTMP又称实时消息传输协议&#xff0c;是一种实时通信协议。在当今数字化时代&#xff0c;手机直播源码平台为全球用户进行服务&#xff0c;如何才能增加用户&#xff0c;提升用户黏性&#xff1f;就需要让一对一直播平台能够为用户提供优质的体验。…

“石头剪刀布”游戏:while、函数自调用实现循环游戏

if…else实现“石头剪刀布”游戏&#xff0c;while、函数自调用实现循环游戏。 (本笔记适合学过if…else的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c…

〔016〕Stable Diffusion 之 模型工具箱和图片背景移除 篇

✨ 目录 &#x1f388; 下载插件&#x1f388; 基础使用界面&#x1f388; 高级使用界面&#x1f388; 下载背景移除插件&#x1f388; 移除插件使用 &#x1f388; 下载插件 由于模型很多&#xff0c;而且底模也非常大&#xff0c;对于空间占用比较大&#xff0c;如果想缩小模…

Nexus2迁移升级到Nexus3

与 Nexus 2.x 相比&#xff0c;Nexus 3.x 为我们提供了更多实用的新特性。SonaType 官方建议我们&#xff0c;使用最新版本 Nexus 2.x 升级到最新版本 Nexus 3.x&#xff0c;并在 Nexus 升级兼容性 一文中为我们提供了各个版本 Nexus 升级到最新版本 Nexus 3.x 的流程&#xff…

《金字塔原理》(表达的逻辑)

前言&#xff1a;在思考和表达上&#xff0c;很多时候显得很混乱&#xff0c;源于不了解结构化思想、表达&#xff0c;如何让话讲得更有逻辑&#xff1f;事做得更有条理&#xff1f;接触到了一本书&#xff1a;《金字塔原理》&#xff0c;通过这本书的学习&#xff0c;希望可以…

把握潮流:服装定制小程序的发展与趋势

随着互联网的快速发展&#xff0c;小程序成为了人们生活中不可或缺的一部分。尤其在服装行业&#xff0c;定制化已经成为了一种趋势。为了满足消费者个性化的需求&#xff0c;服装定制小程序应运而生。 为了方便开发者的设计和制作&#xff0c;我们可以使用第三方的制作平台来创…

Redis数据结构之List

Redis 中列表&#xff08;List&#xff09;类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串成为元素 Eelement&#xff09;&#xff0c;一个列表最多可以存储 2^32-1 个元素。 在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&am…

【Spring框架】Spring事务的介绍与使用方法

⚠️ 再提醒一次&#xff1a;Spring 本身并不实现事务&#xff0c;Spring事务 的本质还是底层数据库对事务的支持。你的程序是否支持事务首先取决于数据库 &#xff0c;比如使用 MySQL 的话&#xff0c;如果你选择的是 innodb 引擎&#xff0c;那么恭喜你&#xff0c;是可以支持…

QT中的按钮控件Buttons介绍

目录 Buttons 按钮控件 1、常用属性介绍 2、按钮介绍 2.1QPushButton 普通按钮 2.2QtoolButton 工具按钮 2.3Radio Button单选按钮 2.4CheckButton复选按钮 2.5Commam Link Button命令链接按钮 2.6Dialog Button Box命令链接按钮 Buttons 按钮控件 在Qt里&#xff0c;…

纯手写Tomcat,看不懂你来揍我【附源码、图文详解】

源码放在了文章末尾 理论知识 何为Tomcat Tomcat是一个开源的Servlet容器&#xff0c;它实现了Java Servlet、JavaServer Pages (JSP)、WebSocket等Java EE规范&#xff0c;用于在Web服务器上运行Java Web应用程序。 说的简单点&#xff0c;Tomcat能处理网络传输来的请求。 …

广告牌安全传感器,实时监测事故隐患尽在掌握

在现代城市中&#xff0c;广告牌作为商业宣传的重要媒介&#xff0c;已然成为城市中一道独特的风景线。然而&#xff0c;随着城市迅速发展&#xff0c;广告牌的安全问题也引起了大众关注。广告招牌一般悬挂于建筑物高处&#xff0c;量大面大。由于设计、材料、施工方法的缺陷&a…

PCIE超高速实时运动控制卡在六面外观视觉检测上的应用

市场应用背景 XPCIE1028超高速实时运动控制卡在六面外观检测高速视觉筛选中的应用&#xff0c;结合正运动技术提供的专用筛选机调试软件&#xff0c;可实现15000pcs/分钟的IO触发检测速度&#xff0c;只需简单参数设置&#xff0c;搭配图像采集硬件和视觉处理软件&#xff0c;…

【算法】活用双指针完成复写零操作

Problem: 1089. 复写零 文章目录 题目解析算法原理分析找到最后一个复写的位置从后往前进行复写操作 代码展示 题目解析 首先我们来分析一下本题的题目意思 可以看到题目中给到了一个数组&#xff0c;意思是让我们将数组中的零元素都复写一遍&#xff0c;然后将其余的元素向后平…

python知识:什么是字符编码?

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们的MySQL使用latin1的默认字符集&#xff0c; 也就是说&#xff0c;对汉字字段直接使用GBK内码的编码进行存储&#xff0c; 当需要对一些有汉字的字段进行拼音排序时&#xff08;特别涉及到类似于名字这样的字段时…