专门做孩子早教的网站,嵌入式软件开发面试问题,您备案的网站名称没有关联性,美团网站是用什么做的一#xff1a;HTTP的基本概念
全称#xff1a;
超文本传输协议
从三个方面介绍HTTP协议
1#xff0c;超文本#xff1a;我们先来理解「文本」#xff0c;在互联网早期的时候只是简单的字符文字#xff0c;但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等HTTP的基本概念
全称
超文本传输协议
从三个方面介绍HTTP协议
1超文本我们先来理解「文本」在互联网早期的时候只是简单的字符文字但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等在 HTTP 眼里这些都算作「文本」。再来理解「超文本」它就是超越了普通文本的文本它是文字、图片、视频等的混合体最关键有超链接能从一个超文本跳转到另外一个超文本。HTML 就是最常见的超文本了它本身只是纯文字文件但内部用很多标签定义了图片、视频等的链接再经过浏览器的解释呈现给我们的就是一个文字、有画面的网页了。 2传输从A-B或者从B-A这里表示HTTP是一个双向的协议。我们在上网冲浪时浏览器是请求方 A百度网站就是应答方 B。双方约定用 HTTP 协议来通信于是浏览器把请求数据发送给网站网站再把一些数据返回给浏览器最后由浏览器渲染在屏幕就可以看到图片、视频了。 3协议协议表示的是两者以上共同履行的一个约定或一个规范超文本传输协议HTTP 使用计算机能够理解的语言确立了一种计算机之间交流通信的规范以及相关的各种控制和错误处理方式。
二常见的状态码
1)1xx: 信息响应
100 Continue:服务器已接收请求的初步部分客户端应继续请求。
101 Switching Protocols:服务器同意切换协议如从HTTP 切换到 WebSocket.
2)2xx: 成功
200 OK:请求成功服务器返回所请求的资源或数据。
201 Created:请求成功并创建了新的资源常用于 POST 请求。204 No Content:请求成功但服务器不返回任何内容常用于除操作。
3)3xx: 重定向
301 Moved Permanently:资源已永久移动到新的 URL客户端应使用新 URL 访问
302 Found:资源临时移动到新的 URL客户端应继续使用原来的 URL。
304 Not Modified:资源未修改客户端可以使用缓存版本
4)4xx: 客户端错误
400 Bad Request:请求无效或语法错误服务器无法处理,
401 Unauthorized:请求需要身份验证客户端未提供有效的凭证。
403 Forbidden:服务器理解请求但拒绝执行通常是权限问题。
404 Not Found:请求的资源在服务器上未找到。
5)5xx: 服务器错误
500 Internal Server Error:服务器内部错误无法完成请求。
502 Bad Gateway:服务器作为网关或代理从上游服务器接收到无效响应。
503 Service Unavailable:服务器暂时无法处理请求通常是因为过载或维护 三HTTP请求、响应的内容
请求 请求行
请求行是 HTTP 请求的第一行包含了以下三个部分
请求方法指明客户端要对服务器执行的操作常见的有
GET用于从服务器获取资源请求的资源会附带在响应中返回例如在浏览器地址栏输入网址访问网页就是使用 GET 方法向服务器请求网页资源。
POST通常用于向服务器提交数据比如在网页上填写表单并提交时一般会使用 POST 方法将表单数据发送到服务器。
PUT用于更新服务器上的资源将请求体中的数据替换指定的资源。
DELETE用于删除服务器上指定的资源。
等等.....
请求 URL指定客户端要请求的资源的统一资源定位符URL地址它标识了请求的目标资源在服务器中的位置例如https://www.example.com/index.html 。
协议版本指定客户端使用的 HTTP 协议版本常见的有 HTTP/1.0、HTTP/1.1 等例如HTTP/1.1 。 请求头
请求头是客户端发送给服务器的附加信息包含了客户端的相关配置和要求等元数据常见的有
Host指定请求的目标服务器的主机名和端口号若端口号是默认的 80HTTP或 443HTTPS则端口号可省略用于服务器识别请求的目标。
User - Agent标识发起请求的客户端应用程序的信息包括浏览器类型、版本、操作系统、设备类型等例如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 服务器可据此返回适合该客户端的内容。
Accept指定客户端能够接受的响应内容的类型MIME 类型例如text/html,application/json 表示客户端可以接受 HTML 和 JSON 格式的数据。
Content - Type当请求体中包含数据时用于指定请求体中发送的数据的类型比如application/x - www - form - urlencoded 表示表单数据以 URL 编码形式发送application/json 表示请求体是 JSON 格式的数据。
Authorization用于在请求中传递授权凭证以便客户端进行身份验证例如包含访问令牌等信息服务器据此验证客户端是否有权限访问请求的资源。
Cookie用于在请求中传递保存在客户端的会话信息服务器可以利用这些信息识别用户身份、跟踪用户会话等。
Accept - Charset指示客户端可以接受的字符集如utf - 8 表示接受 UTF - 8 编码的数据。
Accept - Encoding指示客户端可以接受的内容编码方式常见的有gzip 、deflate 等服务器可以按照客户端支持的方式对响应数据进行压缩。
Accept - Language指示客户端可以接受的语言例如en - US 表示接受美国英语服务器可据此返回对应语言的内容。
Referer指示当前请求页面的来源页面地址用于跟踪用户从哪个页面发起的请求例如从页面 A 点击链接跳转到页面 B页面 B 的请求头中的 Referer 字段会包含页面 A 的地址。
Connection主要用于控制客户端和服务器之间的连接行为。keep - alive这是 HTTP/1.1 协议中的默认值。它表示客户端希望在本次请求完成后该 TCP 连接不会立即关闭而是保持打开状态以便后续可以在同一个连接上发送新的 HTTP 请求。值为close表示客户端希望在本次请求完成后服务器关闭该 TCP 连接。 http响应
状态行
状态行由三部分组成用于描述响应的状态信息具体如下
协议版本表明服务器使用的 HTTP 协议版本常见的有 HTTP/1.0、HTTP/1.1、HTTP/2 等。例如 “HTTP/1.1” 。
状态码是一个三位数用于表示请求的处理结果常见的状态码有
200 OK表示服务器成功处理了请求请求的资源正常返回。
状态描述是对状态码的简短文本描述用于更直观地说明状态码的含义例如 “OK” 对应状态码 200“Not Found” 对应状态码 404 等。 响应头
响应头由多个键值对组成包含了与响应有关的元数据常见的响应头有
Content - Type指定响应体的内容类型MIME 类型和字符集例如 “text/html; charsetutf - 8” 表示响应体是 HTML 格式字符编码为 UTF - 8“application/json” 则表示响应体是 JSON 格式的数据。
Content - Length用于指定响应体的长度字节数以便客户端知道需要接收多少数据。
Location在重定向响应如 301、302 状态码中该字段指定资源新的 URL 地址客户端会根据此地址重新发送请求。
Set - Cookie用于在客户端设置 Cookie服务器可以通过它来识别用户身份、跟踪用户会话等例如 “Set - Cookie: session_id123456; expiresThu, 01 - Jan - 2026 00:00:00 GMT; path/” 。
Cache - Control指定缓存策略控制客户端和中间缓存服务器如何缓存和处理响应例如 “Cache - Control: no - cache” 表示不允许缓存每次都需要从服务器获取最新内容“Cache - Control: max - age 3600” 表示响应可以被缓存且在 3600 秒内是有效的。
Date表示服务器生成响应的日期和时间例如 “Date: Sat, 26 Nov 2023 08:45:30 GMT” 。
Server指明处理请求的 Web 服务器软件信息如 “Server: Apache/2.4.41 (Ubuntu)” 但出于安全考虑有时服务器可能会隐藏或模糊此信息。
Expires指定响应的过期时间在该时间之后缓存的响应将被视为无效需要重新从服务器获取例如 “Expires: Thu, 01 Dec 2023 12:00:00 GMT” 。
Last - Modified表示所请求资源在服务器上的最后修改时间客户端可以利用这个信息进行缓存验证例如 “Last - Modified: Mon, 15 Nov 2023 10:30:00 GMT” 。
Connection主要用于控制客户端和服务器之间的连接行为。值为keep - alive服务器通过该值告知客户端本次响应完成后连接将保持打开状态客户端可以继续在该连接上发送新请求。值为close表示服务器在发送完本次响应后会关闭该 TCP 连接。当服务器检测到客户端可能存在异常行为、资源紧张或者需要强制关闭连接等情况时可能会在响应头中设置Connection: close 四GET和POST的区别
浏览器行为
GET通常用于获取资源浏览器会将 GET 请求的 URL 显示在地址栏中用户可以直接在地址栏输入 URL 发起 GET 请求并且可以对其进行收藏。例如在浏览器中输入百度的搜索词URL 会包含搜索内容此时就是一个 GET 请求。
POST一般用于向服务器提交数据浏览器不会在地址栏中显示 POST 请求的数据用户无法直接通过地址栏发起 POST 请求也不能直接收藏 POST 请求。例如用户登录网站时输入的用户名和密码通过 POST 请求发送这些信息不会显示在地址栏。
传参方式
GET参数通过 URL 的查询字符串传递多个参数之间用符号分隔。例如http://example.com/search?keywordapplepage1其中keyword和page是参数名apple和1是对应的值。URL 的长度受限于浏览器和服务器的限制一般较短。
POST参数放在请求体中不在 URL 中显示。请求体可以包含各种格式的数据如表单数据application/x-www-form-urlencoded、JSON 数据application/json等。这种方式理论上对数据长度没有限制适用于传输大量数据。
安全性
GET由于参数暴露在 URL 中容易被他人通过查看浏览器历史记录、服务器日志等方式获取安全性较差。例如如果在 GET 请求的 URL 中传递密码很容易被泄露。
POST参数在请求体中相对不易被窃取但这并不意味着 POST 请求就是绝对安全的。如果传输过程没有加密如未使用 HTTPS数据仍然可能被拦截和篡改。要确保安全性还需要结合其他安全措施如加密传输、身份验证等。
幂等性
GET具有幂等性即多次执行相同的 GET 请求对服务器资源的影响是相同的不会产生额外的副作用。例如多次请求获取一篇文章的内容每次得到的结果应该是一样的且不会对文章本身造成改变。
POST不具有幂等性多次提交相同的 POST 请求可能会在服务器上创建多个相同的资源。例如多次提交订单创建请求可能会产生多个相同的订单。
缓存机制
GET通常可以被浏览器缓存因为 GET 请求主要用于获取资源且多次请求结果相同。浏览器可以根据缓存策略直接从本地缓存中返回响应减少服务器负载和网络传输。例如用户刷新页面时如果资源在缓存有效期内浏览器可能直接从缓存中加载。
POST一般不会被缓存因为 POST 请求用于提交数据每次请求的结果可能不同缓存没有意义。而且如果缓存 POST 请求再次使用缓存数据时可能会导致重复提交等问题。
TCP 连接
GET在发送请求时浏览器会先将请求头和参数组装好然后一次性发送给服务器。因为 GET 请求的参数通常在 URL 中数据量相对较小这种一次性发送的方式效率较高。一般可以复用
POST浏览器会先发送请求头服务器响应后再发送请求体。这是因为 POST 请求的请求体可能较大分头发送可以让服务器先处理请求头中的信息如验证用户身份等然后再根据情况处理请求体。但在实际应用中现代浏览器和服务器的优化机制可能会使这种差异不太明显。某些情况会启用新的tcp链接
数据发送
GET适合发送少量的数据因为 URL 长度有限制。一般来说不同浏览器对 URL 长度的限制不同但通常在几千字节左右。如果数据量过大可能会导致请求失败。
POST适合发送大量数据因为请求体理论上没有大小限制。这使得 POST 请求在处理如文件上传、大量表单数据提交等场景时更为适用。 五HTTP缓存技术
对于一些具有重复性的 HTTP 请求比如每次请求得到的数据都一样的我们可以把这对「请求-响应」的数据都缓存在本地那么下次就直接读取本地的数据不必在通过网络获取服务器的响应了
强制缓存 强缓存是利用下面这两个 HTTP 响应头部Response Header字段实现的它们都用来表示资源在客户端缓存的有效期Cache-Control 是一个相对时间Expires是一个绝对时间如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话Cache-Control 的优先级高于 Expires 。
Cache-control 选项更多一些设置更加精细所以建议使用 Cache-Control 来实现强缓存。具体的实现流程如下
当浏览器第一次请求访问服务器资源时服务器会在返回这个资源的同时在 Response 头部加上 Cache-ControlCache-Control 中设置了过期时间大小
浏览器再次请求访问服务器中的该资源时会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小来计算出该资源是否过期如果没有则使用该缓存否则重新请求服务器
服务器再次收到请求后会再次更新 Response 头部的 Cache-Control。
协商缓存
当我们在浏览器使用开发者工具的时候你可能会看到过某些请求的响应码是 304这个是告诉浏览器可以使用本地缓存的资源通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。 协商缓存可以基于两种头部来实现。
第一种请求头部中的 If-Modified-Since 字段与响应头部中Last-Modified 字段实现这两个字段的意思是
响应头部中的 Last-Modified标示这个响应资源的最后修改时间
请求头部中的 If-Modified-Since当资源过期了发现响应头中具有Last-Modified 声明则再次发起请求的时候带上 Last-Modified 的时间服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比Last-Modified如果最后修改时间较新大说明资源又被改过则返回最新资源HTTP 200 OK如果最后修改时间较旧小说明资源无新修改响应 HTTP 304 走缓存。
第二种请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段这两个字段的意思是
响应头部中 Etag唯一标识响应资源
请求头部中的 If-None-Match当资源过期时浏览器发现响应头里有 Etag则再次向服务器发起请求时会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对如果资源没有变化返回 304如果资源变化了返回 200。
第一种实现方式是基于时间实现的第二种实现方式是基于一个唯一标识实现的相对来说后者可以更加准确地判断文件内容是否被修改避免由于时间篡改导致的不可靠问题。
如果在第一次请求资源的时候服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段那么客户端再下一次请求的时候如果带上了 ETag 和 Last-Modified 字段信息给服务端这时 Etag 的优先级更高也就是服务端先会判断 Etag 是否变化了如果 Etag 有变化就不用在判断 Last-Modified 了如果 Etag 没有变化然后再看 Last-Modified。
**为什么 ETag 的优先级更高**这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决的问题
在没有修改文件内容情况下文件的最后修改时间可能也会改变这会导致客户端认为这文件被改动了从而重新请求
可能有些文件是在秒级以内修改的If-Modified-Since 能检查到的粒度是秒级的使用 Etag就能够保证这种需求下客户端在 1 秒内能刷新多次
有些服务器不能精确获取文件的最后修改时间。
注意协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用只有在未能命中强制缓存的时候才能发起带有协商缓存字段的请求。