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

HTTP 请求与响应的结构

一、引言

在当今数字化的时代,网络通信如同空气一般无处不在,而HTTP协议则是网络世界中最为重要的基石之一。当我们在浏览器中输入一个网址,轻松浏览网页、观看视频、下载文件或是进行在线购物等操作时,背后HTTP协议都在默默地发挥着关键作用,它负责客户端与服务器之间的数据传输,使得信息能够准确无误地交互。

为了更好地理解网络通信的本质,深入学习HTTP请求与响应的结构就显得尤为必要。这就好比我们要了解一封信的传递过程,不仅要知道信的内容,还得明白信封上的地址、格式等信息。HTTP请求如同寄信人发出的信件,包含着向服务器索取信息的具体要求;而HTTP响应则像是收件人的回信,给予客户端所需要的资源或反馈。掌握它们的结构,能帮助我们在开发Web应用、排查网络故障、优化性能等诸多方面更加得心应手,接下来就让我们一同揭开HTTP请求与响应结构的神秘面纱。

二、HTTP 请求的结构剖析

2.1 请求行:请求的“导航仪”

请求行位于HTTP请求的起始位置,如同领航的船只,为整个请求指明方向,它由三个关键部分构成:请求方法、URL(统一资源定位符)以及协议版本,各部分之间以空格分隔。

请求方法明确了客户端期望对服务器资源执行的操作类型。常见的请求方法有GET、POST、PUT、DELETE等。其中,GET方法犹如一位安静的访客,通常用于从服务器获取资源,当我们在浏览器地址栏输入网址并回车,浏览器发送的就是GET请求,目的是获取对应的网页文档;POST方法则像是一个积极的参与者,多用于向服务器提交数据,比如在登录账号页面,当我们输入用户名和密码后点击登录按钮,浏览器往往会使用POST方法将这些数据发送给服务器,以便进行身份验证;PUT方法类似一个严谨的更新者,用于向服务器上传文件或更新资源,就好比我们在使用一些支持在线编辑的文档工具时,保存修改后的文档就可能用到PUT方法;DELETE方法如同一位清理工,负责请求服务器删除指定的资源,例如删除云端存储中的某个文件。

URL精准定位了客户端想要访问的资源在服务器上的位置,它是互联网上每个文件的“身份证”,包含了协议方案名(如http、https)、服务器地址(可以是域名或IP地址)、端口号(若省略则使用协议默认端口,http默认80,https默认443)、带层次的文件路径以及查询字符串等信息。举个例子,在“https://www.example.com/products?id=123”这个URL中,“https”是协议方案名,确保数据传输的安全性;“www.example.com”是服务器的域名,通过DNS解析可找到对应的IP地址;“products”是文件路径,指向服务器上存放产品信息的页面或接口;“id=123”则是查询字符串,用于向服务器传递额外参数,这里表示想要获取ID为123的产品详情。

协议版本表明了HTTP协议的具体版本,常见的有HTTP/1.1和HTTP/2等。不同版本在性能、功能等方面存在差异,HTTP/1.1是广泛应用的版本,支持持久连接等特性,减少了反复建立连接的开销;HTTP/2则在传输性能上进一步优化,采用二进制分帧层,能实现多路复用,让多个请求和响应可以并行传输,大大提高了页面加载速度。

2.2 请求头:请求的“说明书”

请求头紧跟在请求行之后,犹如一本详细的说明书,为服务器提供了诸多关于客户端的附加信息,帮助服务器更好地理解和处理请求。请求头由多个键值对组成,每个键值对独占一行,格式为“属性名:属性值”。

常见的请求头有Host,它指定了被请求资源所在的服务器主机名和端口号,这是因为一个服务器可能托管多个域名,通过Host头,服务器就能明确客户端想要访问的具体站点。例如,当我们访问“www.baidu.com”时,请求头中的Host值即为“www.baidu.com”,确保服务器将对应的百度页面资源返回给我们。

User-Agent则像是客户端的“名片”,它包含了发出请求的客户端的软件类型、版本号、操作系统等信息。比如“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36”,从这里服务器可以知道客户端使用的是Windows 10操作系统,64位版本,通过Chrome浏览器访问,版本号为96.0.4664.45。服务器可以依据这些信息优化返回的内容,针对不同浏览器特性提供适配的页面样式或功能,实现更好的用户体验。

Accept用于告知服务器客户端能够接受的响应内容类型,常见的值有“text/html”(表示接受HTML文档)、“application/json”(用于接收JSON格式数据,常用于前后端数据交互的API请求)、“image/jpeg”(接受JPEG图片格式)等,还可以使用“q”参数来指定优先级,如“Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”,表示客户端最希望接收text/html类型,如果服务器无法提供,再考虑其他类型,优先级依次降低。

再如Referer,它记录了当前请求是从哪个URL跳转而来的,这对于服务器了解用户的访问路径非常有用,可用于防盗链、统计分析等场景。若我们从搜索引擎结果页点击链接进入某个网站,Referer头就会包含搜索引擎结果页的URL,网站服务器便能知晓流量来源。

当我们使用浏览器访问一个网站时,打开开发者工具查看网络请求,在请求头部分就能看到类似如下丰富的信息:

 

GET / HTTP/1.1

Host: www.example.com

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:90.0) Gecko/20100101 Firefox/90.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate, br

Referer: https://www.google.com

Connection: keep-alive

Upgrade-Insecure-Requests: 1

2.3 空行:请求的“分隔符”

空行看似简单,实则作用重大,它是请求头和请求体之间的一道清晰“分隔符”。在HTTP请求的文本格式中,当服务器读取到空行时,便知晓请求头的信息已经传输完毕,接下来要接收的是请求体的数据(如果有请求体的话)。

这就好比写信时,信的正文内容与信封上的地址等信息需要有明显区分,空行就起到了这个划分界限的作用,让服务器能够准确无误地解析请求,避免信息混淆,确保请求的各部分按正确的顺序被处理。

2.4 请求体:请求的“数据包”

请求体位于空行之后,是HTTP请求携带数据的“数据包”,不过并非所有请求都有请求体。如前文所述,GET请求一般用于获取资源,通常不需要请求体,它将少量参数通过URL的查询字符串传递;而POST请求常用于向服务器提交大量或敏感数据,这些数据就存放在请求体中。

以表单提交为例,当我们在网页上填写一个注册表单,包含用户名、密码、邮箱等信息,点击提交按钮后,浏览器会构造一个POST请求,请求体中按照Content-Type指定的格式对数据进行编码。若Content-Type为“application/x-www-form-urlencoded”,则请求体中的数据形如“username=abc&password=123&email=abc@example.com”,以键值对形式连接,方便服务器解析获取各个字段的值;若上传文件,Content-Type通常会设置为“multipart/form-data”,请求体则被划分为多个部分,每个部分有自己的边界标识、Content-Disposition头部(指定字段名、文件名等),用于清晰区分不同的表单字段和文件内容,确保服务器能准确识别并处理上传的文件及其他数据。

三、HTTP 响应的结构揭秘

3.1 状态行:响应的“信号灯”

状态行处于HTTP响应的开篇之首,宛如一盏信号灯,瞬间为客户端照亮请求处理结果的道路。它由协议版本、状态码以及状态码描述三部分紧密相连组成,中间以空格分隔。

协议版本表明服务器响应所遵循的HTTP协议具体版本,这与请求行中的协议版本相呼应,确保双方在同一通信规则下交流,常见同样有HTTP/1.1、HTTP/2等。

状态码则是一个三位数的神秘数字,它精准概括了请求的处理情况,不同范围的数字有着不同的含义。以常见的状态码为例,200意味着请求顺利抵达目的地,服务器成功理解并处理了请求,就像我们在浏览器中输入一个正确的网址,页面完整且流畅地呈现出来,背后就是服务器返回了200状态码;404状态码想必大家在日常上网中也频繁遭遇,它表示服务器找不到客户端所请求的资源,可能是网址拼写错误、页面已被删除或移动,此时浏览器就会根据这个404状态码展示出“页面未找到”的提示信息;500状态码预示着服务器内部出现了故障,在处理请求的过程中遭遇意外错误,导致无法正常提供响应,比如服务器端的代码出现逻辑错误、数据库连接异常等情况,都会引发500错误,让客户端页面陷入加载失败或显示错误提示的困境。

状态码描述则是对状态码含义的文字解读,进一步辅助客户端理解状态码背后的意义,例如对应200的“OK”、404的“Not Found”、500的“Internal Server Error”,让开发者和用户能更直观地知晓请求的大致结果。

3.2 响应头:响应的“说明书”

响应头如同服务器给客户端的一本详细“说明书”,满载着服务器自身以及返回数据的关键信息,为客户端正确解读和处理响应数据提供精准指引。它同样由多个键值对排列而成,每行格式为“属性名:属性值”。

Content-Type是其中极为关键的一员,它明确指定了响应体中数据的类型,常见的值如“text/html”表明响应体是HTML网页文档,浏览器会依据此类型调用相应的解析引擎来渲染页面;“application/json”则代表响应体是JSON格式的数据,常用于前后端数据交互的接口响应,方便前端JavaScript代码直接进行数据处理;“image/jpeg”说明响应的是JPEG格式的图片数据,浏览器会自动以图片形式展示。

Content-Length则告知客户端响应体数据的字节长度,这有助于客户端精确知晓需要接收的数据量,确保数据完整接收,避免传输错误或遗漏,比如当浏览器知道即将接收的图片数据长度为1024字节,就会耐心等待接收完这些字节后再进行完整的图片显示操作。

Server响应头字段会透露服务器软件的名称及版本号,像“Server: Apache/2.4.46 (Unix)”,一方面有助于开发者了解网站后端架构,另一方面在遇到兼容性问题或排查故障时,能快速定位服务器环境因素,判断是否是服务器软件版本导致的异常。

此外,还有诸如Date响应头,记录了服务器生成响应的日期和时间,格式遵循特定标准,如“Date: Tue, 18 Oct 2022 08:15:30 GMT”,这对于客户端判断数据时效性、缓存策略制定等方面有着重要参考意义;Cache-Control响应头则用于控制客户端和中间代理服务器对响应数据的缓存行为,如“Cache-Control: max-age=3600”表示客户端可以缓存该响应内容1小时,在这期间再次请求相同资源时,可直接使用本地缓存,减少网络传输,提升性能。

3.3 空行:响应的“分隔符”

空行在HTTP响应中的角色依然是不可或缺的“分隔符”,它位于响应头的末尾,清晰地将响应头与响应体划分开来。当客户端读取到空行时,便能心领神会,知晓接下来接收的将是实实在在的响应体数据,这与请求中的空行作用异曲同工,都是为了保证HTTP报文结构的清晰与严谨,避免信息混淆,让数据传输有条不紊地进行。

3.4 响应体:响应的“成果展示”

响应体承载着服务器给予客户端的“丰硕成果”,是整个响应的核心部分,包含了客户端所请求的实际数据。这些数据的形式丰富多样,完全取决于请求的性质与服务器的处理逻辑。

当我们通过浏览器访问一个普通网页时,响应体通常是HTML代码,这些代码包含了网页的结构、样式、文本、图片引用等信息,浏览器在接收到HTML格式的响应体后,会按照HTML规范进行解析、渲染,将精美的网页呈现给用户,让我们看到图文并茂、布局合理的页面内容;若客户端发起的是一个查询数据的API请求,比如查询电商平台的商品列表,服务器返回的响应体大概率是JSON格式的数据,其中包含商品的名称、价格、库存、图片链接等详细信息,前端应用程序获取这些JSON数据后,就能动态更新页面,展示最新的商品详情供用户浏览选购;倘若请求的是一张图片、一个音频或视频文件,响应体则直接是对应的二进制文件数据,浏览器会根据响应头中的Content-Type识别文件类型,并调用相应的插件或功能进行播放或展示。

四、请求与响应的协同工作流程

了解了HTTP请求与响应各自的结构后,让我们通过一个常见的用户登录网站的场景,来深入探究它们是如何协同工作,完成一次流畅的数据交互。

当用户在浏览器地址栏输入网站的登录页面网址(如“https://www.example.com/login”),按下回车键后,浏览器首先会开启一系列准备工作。它会对输入的URL进行解析,分离出协议(https)、域名(www.example.com)、路径(/login)等关键信息,随后浏览器需要查找域名对应的IP地址,这一过程通常借助DNS(域名系统)服务器来完成,它就像是互联网的“电话号码簿”,将域名翻译为服务器实际的IP地址,比如将“www.example.com”解析为“192.168.1.100”。

紧接着,浏览器要与服务器建立TCP连接,这是通过经典的“三次握手”过程实现的:首先浏览器(客户端)向服务器发送一个带有SYN(同步序列号)标志的数据包,表明客户端想要建立连接,此时客户端进入SYN_SENT状态;服务器收到后,回复一个同时带有SYN和ACK(确认)标志的数据包,表示服务器同意建立连接并确认收到客户端请求,此时服务器进入SYN_RECV状态;最后客户端再向服务器发送一个带有ACK标志的数据包,确认收到服务器的回应,双方正式建立连接,进入ESTABLISHED状态,这个可靠的连接为后续HTTP数据传输搭建了稳固的通道。

连接建立完毕,浏览器就开始按照HTTP协议的规范构建请求报文。请求行中,请求方法为POST,因为要向服务器提交用户名和密码数据;URL为“https://www.example.com/login”,精准指向登录接口;协议版本假设为HTTP/1.1。请求头部分,Host字段值为“www.example.com”,明确告知服务器请求的目标主机;User-Agent字段填充浏览器的详细信息,如“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36”,让服务器知晓客户端环境;Accept字段表明浏览器能接受的响应类型,如“text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”;还可能包含如Referer字段(记录从哪个页面跳转而来,用于防盗链等)。由于是POST请求,请求体部分则存放着用户在登录页面输入的用户名和密码信息,按照Content-Type指定的格式(如“application/x-www-form-urlencoded”)编码为类似“username=user123&password=abcdef”的字符串。

构建好请求报文后,浏览器通过已经建立的TCP连接将请求发送给服务器。服务器在对应的端口(https默认443端口)上接收请求,首先读取请求行,了解客户端的请求意图(登录操作)、请求资源位置及协议版本,接着解析请求头,获取客户端的各类附加信息,当读取到空行时,知晓即将接收请求体数据,然后完整获取请求体中的用户名和密码。

服务器端的Web应用程序(如使用Python的Flask、Java的Spring Boot等框架搭建)接收到这些数据后,会对用户名和密码进行验证,可能涉及查询数据库比对存储的用户信息。若验证通过,服务器开始构建响应报文。状态行中,协议版本同样为HTTP/1.1,状态码为200,表示请求处理成功;响应头部分,Content-Type设置为“text/html”,表明返回给客户端的是HTML页面,Server字段填写服务器软件信息,如“Server: Apache/2.4.46 (Unix)”,还可能包含Set-Cookie字段,用于设置用户登录状态的Cookie信息,方便后续用户访问其他页面时保持登录态;响应体部分则是登录成功后要展示给用户的页面HTML代码,包含欢迎信息、用户个人资料展示模块、导航栏等内容。

最后,服务器将响应报文通过TCP连接发送回浏览器。浏览器收到响应后,首先读取状态行,看到200状态码便知晓请求成功,接着解析响应头获取返回数据的类型、服务器信息等,当遇到空行后,开始按照响应头中Content-Type指定的方式解析响应体中的HTML代码,将页面渲染展示给用户,至此,一次完整的HTTP请求与响应交互圆满完成,用户顺利登录网站,开始后续的浏览、操作等体验。

五、实战案例分析

5.1 案例一:简单网页访问

假设我们使用浏览器访问一个技术博客网站,如“https://www.exampletechblog.com”。当在浏览器地址栏输入网址并回车后,浏览器会构建如下的HTTP请求报文:

 

GET / HTTP/1.1

Host: www.exampletechblog.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate, br

Referer: https://www.google.com

Connection: keep-alive

Upgrade-Insecure-Requests: 1

在这个请求报文中,请求行里“GET”表明是获取资源的请求方法,“/”代表请求根目录下的默认页面(通常是网站首页),“HTTP/1.1”是协议版本;请求头中,Host指定了目标服务器主机名,User-Agent告知服务器客户端浏览器及操作系统信息,Accept表示能接受的响应内容类型,这里期望接收HTML文档等,Referer记录了跳转来源(假设从谷歌搜索跳转而来)。

服务器收到请求后,经过一系列处理,可能返回如下的HTTP响应报文:

 

HTTP/1.1 200 OK

Server: Apache/2.4.46 (Unix)

Content-Type: text/html; charset=UTF-8

Content-Length: 12345

Date: Tue, 18 Oct 2022 09:30:00 GMT

Cache-Control: max-age=3600

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Example Tech Blog</title>

</head>

<body>

<h1>Welcome to Our Tech Blog!</h1>

<p>Here you can find the latest tech articles...</p>

</body>

</html>

响应行中“HTTP/1.1”对应请求协议版本,“200 OK”表示请求成功处理;响应头里Server透露服务器软件信息,Content-Type指定响应体是UTF-8编码的HTML文档,Content-Length给出响应体字节长度,Date记录响应生成时间,Cache-Control设定缓存策略;响应体则是实实在在的HTML代码,包含博客首页的标题、欢迎语等内容,浏览器接收后会渲染出美观的网页供用户浏览。

5.2 案例二:API 接口调用

在开发一个天气预报应用时,需要调用天气API接口获取实时天气数据。以某天气API为例,使用Python的requests库进行调用,代码如下:

 

import requests

url = "https://api.weather.com/v1/current?city=Beijing&appid=YOUR_API_KEY"

headers = {

"Accept": "application/json",

"User-Agent": "WeatherApp/1.0"

}

response = requests.get(url, headers=headers)

if response.status_code == 200:

weather_data = response.json()

print(f"当前温度:{weather_data['temp']}℃")

print(f"天气状况:{weather_data['description']}")

else:

print(f"请求失败,状态码:{response.status_code}")

在这段代码中,首先构建了请求的URL,包含查询北京天气的参数“city=Beijing”以及申请的API密钥。请求头里通过“Accept”指定期望接收JSON格式数据,“User-Agent”标识应用名称及版本。发送GET请求后,根据响应的状态码判断请求是否成功,若状态码为200,使用response.json()将响应体(JSON格式字符串)解析为Python字典,方便提取温度、天气状况等数据;若状态码非200,则打印错误提示,告知请求失败。这充分展示了在实际编程中如何灵活运用HTTP请求与响应知识,实现与后端API的高效交互,为应用提供实时、准确的数据支持。

六、总结与展望

通过对HTTP请求与响应结构的深入剖析,我们明晰了其各个组成部分的关键作用与详细格式。请求行宛如指南针,引领着请求的方向;请求头如同贴心助手,为服务器提供丰富的辅助信息;空行作为严谨的分隔符,保障了信息传输的有条不紊;请求体则承载着关键数据,实现客户端与服务器的数据交互。响应行恰似信号灯,迅速反馈请求的处理结果;响应头仿若指引手册,助力客户端准确处理返回数据;空行依旧是清晰的分界,区分响应头与响应体;响应体则是辛勤劳作后的丰收果实,满足客户端的数据需求。

掌握HTTP请求与响应的结构知识,无论是Web开发人员排查接口问题、优化页面性能,还是网络运维人员诊断网络故障、保障服务稳定,都犹如手握利器,能披荆斩棘,高效解决各类难题。

展望未来,HTTP协议仍在持续进化。HTTP/3已崭露头角,凭借QUIC协议,它在传输性能、安全性上实现了重大飞跃,有效解决了TCP协议的队头阻塞、连接建立延迟等问题,让网络通信更加高效、可靠。而随着物联网、人工智能等新兴技术蓬勃兴起,对HTTP协议也提出了全新的挑战与要求,诸如如何更好地适配低功耗、高并发的物联网场景,怎样满足AI模型训练与推理中的大规模数据传输需求等。这都促使着我们在HTTP协议这片知识海洋中不断探索前行,持续学习新知识,紧跟技术发展的浪潮,为构建更加智能、便捷的网络世界贡献力量。

相关文章:

HTTP 请求与响应的结构

一、引言 在当今数字化的时代&#xff0c;网络通信如同空气一般无处不在&#xff0c;而HTTP协议则是网络世界中最为重要的基石之一。当我们在浏览器中输入一个网址&#xff0c;轻松浏览网页、观看视频、下载文件或是进行在线购物等操作时&#xff0c;背后HTTP协议都在默默地发…...

计科高可用服务器架构实训(防火墙、双机热备,VRRP、MSTP、DHCP、OSPF)

一、项目介绍 需求分析&#xff1a; &#xff08;1&#xff09;总部和分部要求网络拓扑简单&#xff0c;方便维护&#xff0c;网络有扩展和冗余性&#xff1b; &#xff08;2&#xff09;总部分财务部&#xff0c;人事部&#xff0c;工程部&#xff0c;技术部&#xff0c;提供…...

Soildworks的学习【2025/1/12】

右键空白处&#xff0c;点击选项卡&#xff0c;即可看到所有已调用的选项卡&#xff1a; 点击机械小齿轮选项卡&#xff0c;选择文档属性&#xff0c;选择GB国标&#xff1a; 之后点击单位&#xff0c;选择MMGS毫米单位&#xff1a; 窗口右下角有MMGS&#xff0c;这里也可以选择…...

ORACLE-表空间和分区控制

--查询最后更新的统计信息时间 SELECT table_name, last_analyzed FROM dba_tables WHERE table_name 表名; --更新统计信息 -----按分区 BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname > XI_SF, -- 模式名称 tabname > 表名, -- 表名称 partnam…...

C# 与 Windows API 交互的“秘密武器”:结构体和联合体

一、引言 在 C# 的编程世界里&#xff0c;当我们想要深入挖掘 Windows 系统的底层功能&#xff0c;与 Windows API 打交道时&#xff0c;结构体和联合体就像是两把神奇的钥匙&#x1f511; 它们能够帮助我们精准地操控数据&#xff0c;实现一些高级且强大的功能。就好比搭建一…...

【数字化】华为-用变革的方法确保规划落地

导读&#xff1a;华为在数字化转型过程中&#xff0c;深刻认识到变革的必要性&#xff0c;并采用了一系列有效的方法确保转型规划的有效落地。华为认为&#xff0c;数字化转型不仅仅是技术层面的革新&#xff0c;更是企业运作模式、流程、组织、文化等深层次的变革。数字化转型…...

SpringData-Redis缓存

Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。 NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言&#xff0c;键值存储代表NoSQL空间中最大…...

大语言模型兵马未动,数据准备粮草先行

​从OpenAI正式发布ChatGPT开始&#xff0c;大型语言模型&#xff08;LLM&#xff09;就变得风靡一时。对业界和吃瓜群众来说&#xff0c;这种技术最大的吸引力来自于理解、解释和生成人类语言的能力&#xff0c;毕竟这曾被认为是人类独有的技能。类似CoPilot这样的工具正在迅速…...

跳表和Mysql联合索引的最左原则和索引下推的优化

文章目录 跳表&#xff08;Skip List&#xff09;关键特性跳表的结构示意图跳表的查询效率为什么 MySQL 不使用跳表而使用 B 树&#xff1f;跳表的实际应用场景 总结 MySQL 联合索引的最左匹配原则最左匹配原则的规则示例&#xff1a;创建联合索引查询示例及索引使用情况设计联…...

Android切换语言不退出App

1.需求 实现用户选择语言&#xff08;未点击下一步&#xff09;&#xff0c;更新当前界面UI&#xff0c;点击下一步后&#xff0c;更新App的语言&#xff0c;并进行保存。 实现目标&#xff1a; 1.设置App的语言&#xff0c;本地进行保存 2.updateResources更新本地语言配置…...

Unity编程与游戏开发-编程与游戏开发的关系

游戏开发是一个复杂的多领域合作过程,涵盖了从创意构思到最终实现的多个方面。在这个过程中,技术、设计与美术三大核心要素相互交织,缺一不可。在游戏开发的过程中,Unity作为一款强大的跨平台游戏引擎,凭借其高效的开发工具和庞大的社区支持,成为了很多游戏开发者的首选工…...

【Git】问题汇总

在push的时候显示 protocol error: bad line length 8192 我在本地创建了一个gogs服务器&#xff0c;现在正在上传代码&#xff0c;但是出现了上述的这个问题。 解决方法 设置本地http.postBuffer&#xff08;待验证&#xff09; 方法一&#xff1a;全局配置 git config --g…...

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...

修改sshd默认配置,提升安全

对于Linux服务器&#xff0c;特别是暴露在公网的服务器&#xff0c;会经常被人扫描、探测和攻击。包括通过ssh访问登录攻击。对此&#xff0c;对默认的sshd配置进行调整&#xff0c;提升安全。 下面以CentOS 7.9为例说明&#xff1a; 一、常见安全措施 以root用户编辑vim /e…...

formik 的使用

礼记有言&#xff1a;独学而无友&#xff0c;则孤陋而寡闻 让我们一起了解更多便捷方法&#xff0c;缩短开发时间去摸鱼&#xff0c;嘿嘿。 框架&#xff1a;react 在写表单的时候&#xff0c;我不太喜欢把验证写的很繁琐&#xff0c;这里讲介绍&#xff0c;验证表单的非常好用…...

【学习笔记】理解深度学习的基础:机器学习

1. 机器学习基础 1.1 机器学习的定义与重要性 定义&#xff1a;深度学习是机器学习的一种特定形式。为了深入理解深度学习&#xff0c;必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法&#xff0c;通过经验E在任务T上提高性能度量P&#xff08;Mi…...

Docker 基础知识

背景 传统的linux的环境部署 命令多步骤多安装版本多使用docker的话,一个命令就可以全部搞定安装linux 之前安装过,所以直接使用的开罩进行复制的如果之前配置过静态地址,需要改成IPV4静态地址访问安装docker 参考连接:https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBk…...

pyqt鸟瞰

QApplication‌是Qt框架中的一个类&#xff0c;专门用于管理基于QWidget的图形用户界面&#xff08;GUI&#xff09;应用程序的控制流和主要设置。QApplication类继承自QGuiApplication&#xff0c;提供了许多与GUI相关的功能&#xff0c;如窗口系统集成、事件处理等。 QAppli…...

Linux syslog 运行机制

Busybox的syslogd认识与使用 syslogd 的基本工作原理&#xff1a; syslogd 是一个系统日志守护进程&#xff0c;它接收来自各种进程和系统服务的日志消息&#xff0c;并根据配置将这些消息存储到不同的日志文件中。 syslogd日志记录器由两个守护进程&#xff08;klogd&#x…...

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频&#xff1a; 系统框图&#xff08;基于串口的数据回环&#xff09;如下&#xff1a; 以下&#xff0c;是串口接收端的波形图&#xff0c;系统时钟和波特率时钟不同&#xff0c;为异步时钟&#xff0c;&#xff0c;需要先延时两拍&#xff0c;将时钟同…...

day38 tcp 并发 ,linux下的IO模型----IO多路复用

TCP 并发 由于tcp协议只能实现一对一的通信模式。为了实现一对多&#xff0c;有以下的的处理方式 1. 多进程 开销大 效率低 2. 多线程 创建线程需要耗时 3. 线程池 多线程模型创建线程耗时问题&#xff0c;提前创建 4. IO多路复用 在不创建进程和线程的前提下&#xff0c;对…...

el-date-picker 禁用一个月前、一个月后(当天之后)的时间 datetimerange

文章目录 功能需求今天是 2025-01-09示例1示例2 代码 Vue2 功能需求 时间范围选择器&#xff0c;最大时间选择尺度为一个月。 今天是 2025-01-09 示例1 选择 2025-01-02 日 禁用未来日期&#xff08;2025-01-09之后日期&#xff09; 禁用上月2号&#xff08;31日之前&#…...

ES6的高阶语法特性

一、模板字符串的高级用法 1.1.模板字符串的嵌套 模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。 1. 嵌套示例 假设我们有一个包含多个对象的数组&#xff0c;每个对象都有名称、…...

数据在内存的存储

数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 1字节 打印%c short //短整型 2字节 打印%hd int //整形 4字节 打印%d long long int //长整型 4/8字节 打印%ld l…...

【微服务】面试题 6、分布式事务

分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题&#xff0c;需解决。主流解决方案有阿里 Seata 框架&#xff08;含 XA、AT、TCC 模式&#xff09;和 MQ。 二、Seata 框架关键角色 事务协调者&#xff08;TC&#xff09;&…...

VMware中Ubuntu如何连接网络?安排!

一、设置NAT模式 1、关闭Ubuntu虚拟机&#xff1a; 确保Ubuntu已经完全关机&#xff0c;而不是挂起或休眠状态。 2、编辑虚拟网络设置&#xff1a; 在VMware主界面点击“编辑”菜单&#xff0c;选择“虚拟网络编辑器”。 如果需要&#xff0c;选择VMnet8 (NAT模式)并点击“更改…...

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上&#xff0c;实例是别的同事搭建的。最近又又又想了解一下&#xff0c;而且已经盘了一些了&#xff0c;所以写写记录一下。因为这个事儿没太多的进度压力&#xff0c;索性写到哪儿算哪儿&#xff0c;只要是新了解到的…...

TCP封装数据帧

void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port&#xff0c;port 50000是因为大概前五万都被其它服务所占用&#xff0c;50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...

基于Springboot+Vue的仓库管理系统

开发一个基于Spring Boot和Vue的仓库管理系统涉及到前端和后端的开发。本文呢&#xff0c;给出一个简单的开发步骤指南&#xff0c;用于指导初入的新手小白如何开始构建这样一个系统&#xff0c;如果**你想直接学习全部内容&#xff0c;可以直接拉到文末哦。** 开始之前呢给小…...

工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理

哈喽~这里是维小帮&#xff0c;提供多个场所的定位管理方案&#xff0c;如需获取工厂人员定位管理系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中&#xff0c;我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…...

机器学习特征重要性之feature_importances_属性与permutation_importance方法

一、feature_importances_属性 在机器学习中&#xff0c;分类和回归算法的 feature_importances_ 属性用于衡量每个特征对模型预测的重要性。这个属性通常在基于树的算法中使用&#xff0c;通过 feature_importances_ 属性&#xff0c;您可以了解哪些特征对模型的预测最为重要…...

Go学习:多重赋值与匿名变量

目录 1. 变量的多重赋值 1.1 基本语法格式 1.2 交换变量值 2. 匿名变量的使用 1. 变量的多重赋值 1.1 基本语法格式 go语言中&#xff0c;可以将多个赋值语句 合并成 一句&#xff0c;比如&#xff1a; a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以…...

解读Linux Bridge中的东西流向与南北流向

解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中&#xff0c;网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具&#xff0c;在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…...

spring mvn 国际化配置

目录 国际化配置测试测试自定义一个MessageSource类型的beanSpringApplicationUtil工具类MessageUtls工具类配置 国际化原理ResourceBundleMessageSource 国际化配置测试 测试 测试&#xff1a; 自定义一个MessageSource类型的bean import org.springframework.context.Mess…...

Windows下Dll在Unity中使用的一般方式

Windows下Dll在Unity中使用的一般方式 Unity中虽然已经有广泛的库和插件&#xff0c;但是相较于C的库生态而言&#xff0c;还是有一定的差距&#xff1b;因此本篇博文记录Windows下将C函数打包成动态链接库在Unity中使用的一般方法。 环境 Visual Studio 2019 &#xff0c; Uni…...

SQLite PRAGMA

SQLite的PRAGMA命令是一种特殊的命令&#xff0c;用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取&#xff0c;也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下&#xff1a; 要查询当前的PRAGMA值&#xff0c;只需提供该PRAGMA的名字&am…...

Linux:进程控制

1.fork()函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0…...

一些计算机零碎知识随写(25年1月)-1

我原以为世界上有技术的那批人不会那么闲&#xff0c;我错了&#xff0c;被脚本真实了。 今天正隔着画画呢&#xff0c;手机突然弹出几条安全告警通知。 急忙打开服务器&#xff0c;发现问题不简单&#xff0c;直接关服务器重装系统..... 首先&#xff0c;不要认为小网站&…...

spring mvc源码学习笔记之十

前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道&#xff0c;servlet 容器会自动加载 web.xml。 那么&#xff0c;疑问就来了&#xff0c;WebApplicationInitialize…...

网络安全-安全散列函数,信息摘要SHA-1,MD5原理

安全散列函数 单向散列函数或者安全散列函数之所以重要&#xff0c;不仅在于消息认证(消息摘要。数据指纹)。还有数字签名&#xff08;加强版的消息认证&#xff09;和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求 散列函数的目的是文件、消息或者其它数据…...

《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》

《解锁计算机视觉智慧&#xff1a;编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4&#xff1a;小模型撬动大视觉理解&#xff08;一&#xff09;项目概览&#xff08;二&#xff09;核心亮点&#xff08;三&#xff09;上手体验 二、ClipCap-Chinese&#xff1a;中文场景…...

vue封装axios请求

在vue项目中我们发送请求一般是使用axios 我们可以封装axios来避免冗余代码 首先引入axios npm install axios创建环境配置文件 NODE_ENV development VITE_APP_TITLE dev VITE_APP_BASE_API /test VITE_SERVE "http://127.0.0.1"上面是创建dev配置文件 也可以…...

【前端动效】原生js实现拖拽排课效果

目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;页面左侧有一个包含不同课程&#xff08;如语文、数学等&#xff09;的列表&#xff0c;页面右侧…...

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...

AI华佗?港中大、深圳大数据研究院提出医疗推理大模型HuatuoGPT-o1

编辑 | 白菜叶 OpenAI o1 的突破凸显了通过增强推理能力来提高自然语言大模型&#xff08;LLM&#xff09;的应用潜力。然而&#xff0c;大多数推理研究都集中在数学任务上&#xff0c;而医学等领域尚未得到充分探索。 医学领域虽然不同于数学&#xff0c;但鉴于医疗保健的高…...

openEuler22.03系统使用Kolla-ansible搭建OpenStack

Kolla-ansible 是一个利用 Ansible 自动化工具来搭建 OpenStack 云平台的开源项目&#xff0c;它通过容器化的方式部署 OpenStack 服务&#xff0c;能够简化安装过程、提高部署效率并增强系统的可维护性。 前置环境准备&#xff1a; 系统:openEuler-22.03-LTS-SP4 配置&…...

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…...

初学stm32 --- ADC单通道采集

目录 ADC寄存器介绍&#xff08;F1&#xff09; ADC控制寄存器 1(ADC_CR1) ADC控制寄存器 2(ADC_CR2) ADC采样时间寄存器1(ADC_SMPR1) ADC采样时间寄存器2(ADC_SMPR2) ADC规则序列寄存器 1(ADC_SQR1) ADC规则序列寄存器 2(ADC_SQR2) ADC规则序列寄存器 3(ADC_SQR3) AD…...

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…...

django基于Python的智能停车管理系统

1.系统概述 1.定义&#xff1a;Django 基于 Python 的智能停车管理系统是一个利用 Django 框架构建的软件系统&#xff0c;用于高效地管理停车场的各种事务&#xff0c;包括车辆进出记录、车位预订、收费管理等诸多功能。 2.目的&#xff1a;它的主要目的是提高停车场的运营效…...