No118.精选前端面试题,享受每天的挑战和学习

news2024/11/26 16:24:24

在这里插入图片描述

文章目录

    • 为什么说HTTP是无状态的协议?
    • HTTP 报文结构是怎样的?
    • HTTP1.1 中如何解决 HTTP 的队头阻塞问题?
    • HTTP 中如何处理表单数据的提交?
    • 说下application/x-www-form-urlencoded 和 multipart/form-data
    • 对于定长和不定长的数据,HTTP 是怎么传输的?

为什么说HTTP是无状态的协议?

HTTP 被称为无状态协议,是因为它在不同的请求之间并不保留任何状态信息。每个 HTTP 请求和响应都是独立的,服务器不会记住之前的请求或会话信息。

这是由于 HTTP 的无连接性的特性所决定的。每当客户端发送一个请求给服务器,服务器会根据请求进行处理并发送响应,完成后立即断开连接。在下一个请求中,服务器无法知道上一个请求的信息,也无法获取客户端的状态。

为了维护应用程序或用户状态,通常会使用一些机制实现会话管理,比如使用 Cookie 或者在请求中使用特定的标识符来标记用户会话。这样服务器可以根据这些标识符来识别用户和会话状态。

尽管 HTTP 是无状态的协议,但通过使用会话管理等技术,可以实现状态的保持和管理,使得 HTTP 在实际应用中能够处理复杂的交互和用户认证等需求。

HTTP 报文结构是怎样的?

HTTP 报文结构分为请求报文和响应报文两种类型。

请求报文的结构:

<方法> <请求目标> <HTTP 版本>
<请求头字段 1>: <值 1>
<请求头字段 2>: <值 2>
...
<空行>
<请求主体>

其中,<方法> 表示请求方法(例如 GET、POST、PUT 等),<请求目标> 表示请求的目标 URL,<HTTP 版本> 表示使用的 HTTP 版本号。请求头字段和值由一行一行组成,在空行之前。请求主体是可选的,用于包含请求的数据。

响应报文的结构:

<HTTP 版本> <状态码> <原因短语>
<响应头字段 1>: <值 1>
<响应头字段 2>: <值 2>
...
<空行>
<响应主体>

其中,<HTTP 版本> 表示响应所使用的 HTTP 版本号,<状态码> 表示服务器对请求的处理结果,<原因短语> 是对状态码的简要描述。响应头字段和值由一行一行组成,在空行之前。响应主体也是可选的,用于包含响应的数据。

请求报文和响应报文都采用了 ASCII 文本格式,通过 CRLF(回车换行)来分隔行,空行用于分隔头部和主体。这种简单的结构使得 HTTP 报文易于解析和组装。

HTTP1.1 中如何解决 HTTP 的队头阻塞问题?

在HTTP/1.1中,队头阻塞(Head-of-Line Blocking)是指在一个TCP连接上的请求和响应是按照顺序进行的,如果前面的请求由于某种原因被阻塞,那么后面的请求也会受到影响,导致整体性能下降。

为了解决HTTP的队头阻塞问题,可以采取以下策略:

  1. 使用多个域名:在一个页面中使用多个域名,每个域名对应一个TCP连接,这样可以提高并行度。
  2. 域名分片(Domain Sharding):将一个域名下的资源分解为多个子域名,使得浏览器能够同时并行请求多个资源。
  3. 链接重用:通过在HTTP头中添加Connection: keep-alive字段,保持TCP连接的持久性,避免重复建立和关闭连接的开销。
  4. 分块传输(Chunked Transfer Encoding):可以将响应分割为多个部分进行传输,使得前面的响应可以提前发送给客户端。
  5. 压缩传输:在请求头中添加Accept-Encoding字段,支持服务器对响应进行压缩,减小传输内容大小,提高传输速度。

需要注意的是,尽管这些策略可以减轻HTTP的队头阻塞问题,但并不能完全解决。HTTP/2和HTTP/3协议在协议层面上引入了新的特性,如多路复用、头部压缩等,更好地解决了队头阻塞问题。因此,在新的项目中优先考虑使用HTTP/2或HTTP/3以获取更好的性能表现。

HTTP 中如何处理表单数据的提交?

在 http 中,有两种主要的表单提交的方式,体现在两种不同的Content-Type取值:

application/x-www-form-urlencoded
multipart/form-data
由于表单提交一般是POST请求,很少考虑GET,因此这里我们将默认提交的数据放在请求体中。

在 HTTP 中,表单数据的提交通常使用 POST 请求来完成。有几种常见的方式来提交表单数据:

  1. 表单的 method 属性设置为 post,并将表单的 action 属性指向接收表单数据的服务端接口。提交表单时,浏览器会按照表单字段的名称和值构建一个键值对的数据结构,并将其作为请求体发送给服务端。

  2. 使用 AJAX 技术提交表单数据。可以使用库或原生 JavaScript 的 XMLHttpRequest 对象来发送 POST 请求,将表单字段构建的键值对数据作为请求体发送到服务端。

  3. 使用 Fetch API 来发送 POST 请求。可以使用 fetch 函数发送 POST 请求,并将表单字段构建的键值对数据作为请求体发送给服务端。

无论使用何种方式,服务端都需要接收请求,并解析请求体中的表单数据。服务端可以使用各种编程语言和框架来解析表单数据,常用的包括 PHP 的 $_POST 变量、Java 的 Servlet、Node.js 的 Express 等。

需要注意的是,为了防止跨站请求伪造(CSRF)攻击,通常需要在表单中添加一个令牌(CSRF token),并在服务端验证该令牌的有效性。这可以防止来自其他网站的恶意请求。

总而言之,表单数据的提交是通过发送 POST 请求,并将表单字段构建的键值对数据作为请求体发送给服务端来实现的。

说下application/x-www-form-urlencoded 和 multipart/form-data

application/x-www-form-urlencodedmultipart/form-data 是两种常见的用于在 HTTP 请求中传输表单数据的 Content-Type。

  1. application/x-www-form-urlencoded
其中的数据会被编码成以&分隔的键值对
字符以URL编码方式编码。

这是默认的表单提交方式。在这种格式下,表单数据被编码为键值对的格式,并使用 & 符号分隔。字段名和字段值都需要进行 URL 编码,即对特殊字符进行替换。例如,一个含有两个字段的表单:

name=John+Doe&age=30

这种格式适合简单的表单数据,并且数据量较小。

  1. multipart/form-data
请求头中的 Content-Type 字段会包含 boundary ,且 boundary 的值有浏览器默认指定。
例: Content-Type: multipart/form-data;boundary=----WebkitFormBoundaryRRJKeWfHPGrS4LKe。

数据会分为多个部分,每两个部分之间通过分隔符来分隔,每部分表述均有 HTTP 头部描述子包体,
如Content-Type,在最后的分隔符会加上--表示结束。

这种格式适用于上传文件或提交包含大量字段和较大数据量的表单。在这种格式下,表单数据被划分为多个部分,每个部分对应一个字段或文件。每个部分都有一个自己的头部信息,包含字段名、文件名等。每个部分以 boundary 分隔符作为边界,不同字段的数据之间使用 boundary 进行划分。一般情况下,在请求头中会包含 Content-Type: multipart/form-data; boundary=xxxxx,其中 xxxxx 是一个随机生成的字符串。

这种格式在数据传输时比较灵活,可以支持多个文件上传、二进制数据等。但由于每个部分都需要有自己的头部信息,所以相对于 application/x-www-form-urlencoded 格式会产生更多的额外数据量。

需要根据具体的需求选择合适的格式。如果只是简单的表单数据提交,可以使用 application/x-www-form-urlencoded。如果需要上传文件或传输大量的字段和数据,那么就需要使用 multipart/form-data 格式。

对于定长和不定长的数据,HTTP 是怎么传输的?

对于定长数据,HTTP 使用 Content-Length 头字段来指定消息体的长度。服务器在发送响应时会包含 Content-Length 头字段,客户端在接收响应时会根据这个长度来准确地读取响应的内容。

对于不定长数据,HTTP 使用 Transfer-Encoding 头字段来指定传输编码。常见的传输编码有 chunked 编码和 gzip 编码。在 chunked 编码中,响应的消息体被分割为多个块,每个块都包含一个长度前缀和实际的数据,最后一个块的长度为0。这样,客户端在接收响应时可以逐块读取数据,而不需要等到整个消息体都传输完毕。

对于 gzip 编码,服务器会对响应的消息体进行压缩,然后将压缩后的数据通过流式传输发送给客户端。客户端接收到压缩后的数据后,会对其进行解压缩,得到原始的消息体。

不论是定长数据还是不定长数据,HTTP 都是通过 TCP 连接进行传输的。

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

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

相关文章

影视公司技术流程设计之Pipeline数据管理

使用场景 1 设计师画好设计稿后怎样让导演审查&#xff1f; 叫到位子上看&#xff1f; 放个文件夹会议室统一看&#xff1f;意见怎么记录&#xff0c;怎么反馈&#xff1f; 2 材质&#xff0c;绑定文件怎么与模型同步&#xff0c; 很多时间是绑定不小心改了&#xff0c; 去了灯…

WinRAR<6.23 远程代码执行漏洞【Poc公开】(CVE-2023-38831) [有POC]

漏洞类型代码注入发现时间2023-08-25漏洞等级高危MPS编号MPS-bw2s-d0rvCVE编号CVE-2023-38831漏洞影响广度广 漏洞危害 OSCS 描述WinRAR 是一款适用于 Windows 系统的压缩包管理器。 WinRAR 6.2.3之前版本打开压缩文件时会调用 ShellExecute 函数匹配文件名&#xff0c;如果目…

软件设计师(十一)标准化和软件知识产权基本知识

一、标准化基础知识 标准(Standard)是对重复性事物和概念所做的统一规定 标准化工作的特征包括横向综合性、政策性和统一性 1、基本概念 &#xff08;1&#xff09;标准的分类 国际标准&#xff1a;ISO、IEC等国际标准化组织国家标准&#xff1a;GB一中国、ANSI一美国、BS一…

AIGC领航,智能AI赋能乡村教育,梦想扬帆远航

一位扎根深山支教十年的湖北教师袁辉的故事曾经感受无数人&#xff0c;新华社、人民日报都撰文为他点赞。在他带过的学生中&#xff0c;有一位名叫青青的女学生患有成骨不全症&#xff0c;俗称“瓷娃娃”&#xff0c;学校离家十几公里山路&#xff0c;上学对她来说&#xff0c;…

Java注解与反射

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Java注解与反射 Java注解和反射是Java语言中两个强大的特性&#xff0c;它们可以一起使用以实现动态的、灵活的编程和元数据处理 注解 Java注解&#xff08;Annotatio…

振弦采集读数模块开发原理详细介绍

飞讯教学篇&#xff1a;振弦采集读数模块开发原理详细介绍 振弦采集读数模块是一种用于采集弦振信息的模块&#xff0c;其原理是通过传感器感知弦的振动&#xff0c;将其转化为电信号&#xff0c;然后经过模拟处理和数字化处理&#xff0c;最终输出为可供后续处理的数字信号。…

Python照片压缩教程:如何轻松减小图片大小

介绍 在日常的编程工作中&#xff0c;我们经常需要处理图像&#xff0c;例如上传、下载、显示、编辑等。有时候&#xff0c;我们需要对图像进行压缩&#xff0c;以减少占用的空间和带宽&#xff0c;提高加载速度和用户体验。那么&#xff0c;如何用Python来实现图像压缩呢&…

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量&#xff0c;四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度&#xff0c;协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 从直观上来看&…

开源vue动态表单组件

一、项目简介 vueelement的动态表单组件&#xff0c;拖拽组件到面板即可实现一个表单 二、实现功能 支持拖拽 支持输入框 支持文本框 支持数字输入框 支持下拉选择器 支持多选框 支持日期控件 支持开关 支持动态表格 支持上传图片 支持上传文件 支持标签 支持ht…

无涯教程-Python机器学习 - Semi-supervised Learning函数

Python机器学习 中的 Semi - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-semi-supervised-learning.html

图像翻拍检测——反射分量分离的特征融合

随着计算机技术的迅速发展&#xff0c;需要建立人与信息一一对应的安保认证技术&#xff0c;通过建立完整的映射网络体系&#xff0c;从而确保每个人的人身、财产、隐私等的安全.与指纹、基因等人体生物特征识别系统相比&#xff0c;人脸识别系统更加友好&#xff0c;不需要人的…

【C语言】位操作符的一些题目与技巧

初学者在学完位操作符之后&#xff0c;总是不能很好的掌握&#xff0c;因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受&#xff0c;但是看完一定会有收获 目录 位操作符&#xff1a;一些题目&#xff1a;不创建临时变量交换整数整数转换二进制中1的…

【校招VIP】产品设计分析之思维整体性

考点介绍&#xff1a; 对于产品分析设计时需要全面的分析用户需求&#xff0c;而产品思维方式的核心是“以问题为核心”&#xff0c;即先多花时间搞清楚要解决的问题究竟是什么&#xff0c;要深入、全面的思考。 『产品设计分析之思维整体性』相关题目及解析内容可点击文章末尾…

揭秘偏向锁的升级

今天开始&#xff0c;我会和大家一起深入学习synchronized的原理&#xff0c;原理部分会涉及到两篇&#xff1a; 偏向锁升级到轻量级锁的过程轻量级锁升级到重量级锁的过程 今天我们先来学习偏向锁升级到轻量级锁的过程。因为涉及到大量HotSpot源码&#xff0c;会有单独的一篇…

从钉钉到金蝶云星空通过接口配置打通数据

从钉钉到金蝶云星空通过接口配置打通数据 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能…

python | 将pdf文件转换为图片,这一招就够了

一、背景 部分情况下&#xff0c;需要将 PDF 页面转换为图片&#xff0c;例如 PNG 或 JPEG 格式。 python 的开源库 pdfplumber&#xff0c;提供了将 pdf 文件转换为图片的方法。 如果之前还没有安装和使用过pdfplumber库&#xff0c;pdfplumber的安装及基础使用&#xff0c;可…

【React学习】—SetState的使用(九)

【React学习】—SetState的使用&#xff08;九&#xff09; state的简写方式 state属性总结

PCD格式点云文件结构及在线查看工具

本文档描述了 PCD&#xff08;点云数据&#xff09;文件格式及其在点云库&#xff08;PCL&#xff09;中的使用方式。可以使用NSDT 3DConvert 在线预览查看PCD格式的点云数据文件。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、为何定义新的点云数据文件格式&#…

【问题总结+备忘录】上传一个shp文件能够读取其中的空间矢量字段,代码+采坑总结

需求描述 要求上传一个shp文件能够读取其中的空间矢量字段。 简单分析 SHP上传格式应该有两种&#xff08;zip格式和.shp的格式文件内部可能存在多个空间矢量&#xff0c;结果以列表形式返回文件不大&#xff0c;使用MultipartFile上传上传即可结合geo-tools读取空间字段&am…

【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; vector 1. 前言2. 熟悉vector的接口函数2.1 vec…