HTTP常见面试题
基本概念类
HTTP是什么
http (超文本传输协议,HyperText Transfer Protocol):是一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,简单来说,http就是客户端和服务端进行数据传输的一种规则,它基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。http是一种用于分布式、协作式、超媒体信息系统的应用层传输协议,是万维网(WWW)的数据通信的基础,确保客户端和服务器之间的通信,是互联网上最常用的协议之一。但是由于http为明文传输,所以是不安全的。
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP特性
- 基于请求/响应模型(Request/Response Model):HTTP通信由客户端发起请求,服务器返回响应的模型构成。每次请求都需要客户端主动发起,服务器被动响应。
- 无状态(Stateless):HTTP协议本身不对请求和响应之间的通信状态进行保存。服务器在处理完客户端的请求并收到客户端的应答后,就会断开连接,并且在服务器端不保留任何有关此次会话的信息。这简化了服务器的设计,但也意味着如果客户端和服务器需要维持状态,就需要使用如Cookie、Session等技术来实现。
- 无连接(Connectionless):HTTP/1.1之前的HTTP协议都是无连接的,即每次HTTP请求都由建立连接、发送请求信息、发送响应信息、关闭连接这四个步骤组成,连接在发送完HTTP响应后就被关闭。虽然HTTP/1.1和之后的版本支持持久连接(Persistent Connection),即一次TCP连接可以传送多个HTTP请求和响应,但从根本上说,HTTP还是无连接的。
- 无安全性(Unsecured):HTTP本身并不提供加密或验证的机制,因此在安全性上存在较大隐患。虽然HTTP/S(基于SSL的HTTP)的出现通过加密解决了安全性问题,但基本的HTTP协议仍然是不安全的。
- 简单快速(Simple and Fast):HTTP协议简单,这使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活(Flexible):HTTP允许传输任意类型的数据对象。通过请求和响应报文的HTTP头信息,可以传输文本、图片、音频、视频等多种类型的数据。
- 支持缓存(Caching):HTTP协议支持数据缓存,减少不必要的数据传输,节省带宽。
- 支持内容协商(Content Negotiation):客户端和服务器可以根据客户端的能力或请求的上下文来协商传输的资源格式(如文本、图片等)或语言等。
HTTP缓存机制
强缓存
强缓存是指浏览器在请求资源时,如果资源在缓存中且未过期,则直接从缓存中读取资源,不会向服务器发送请求。
强缓存主要是通过以下HTTP头部字段来设置:
1.Expires:这是HTTP/1.0引入的缓存控制头部字段,它表示资源过期的绝对时间(GMT格式的时间字符串)。在资源过期之前,浏览器可以直接从缓存中读取资源。然而,由于Expires是绝对时间,它存在服务器和客户端时间不同步的问题,因此在实际应用中,建议使用Cache-Control的max-age指令来代替。
2.Cache-Control:这是HTTP/1.1引入的缓存控制头部字段,它提供了比Expires更加灵活和丰富的缓存控制选项。其中,max-age指令用于设置资源在缓存中的最大有效时间(以秒为单位)。在max-age指定的时间内,浏览器将直接从缓存中读取资源,不会向服务器发送请求。此外,Cache-Control还包含其他指令,如no-cache、no-store、public、private等,用于更精细地控制缓存行为。
协商缓存
协商缓存是指当资源的缓存时间已经过期,浏览器会向服务器发送请求,但服务器会检查资源是否有更新。如果资源没有更新,服务器会返回304状态码,告诉浏览器继续使用本地缓存。
协商缓存主要是通过以下HTTP首部字段来设置:
1.Last-Modified / If-Modified-Since:服务器在返回资源时,会在响应头部添加Last-Modified字段,表示资源最后的修改时间(GMT格式的时间字符串)。当浏览器下次请求该资源时,会在请求头部添加If-Modified-Since字段,其值为上次请求时资源的修改时间。服务器会比较Last-Modified和If-Modified-Since的值,如果一致,则返回304状态码,表示资源未更新,浏览器可以继续使用本地缓存。
2.ETag / If-None-Match:服务器在返回资源时,还会在响应头部添加ETag字段,表示资源的唯一标识(通常是一个哈希值)。当浏览器下次请求该资源时,会在请求头部添加If-None-Match字段,其值为上次请求时资源的ETag值。服务器会比较ETag和If-None-Match的值,如果一致,则返回304状态码,表示资源未更新,浏览器可以继续使用本地缓存。
在实际应用中,建议优先使用Cache-Control的max-age指令来设置强缓存,并结合ETag或Last-Modified来实现协商缓存。
HTTP状态码
HTTP响应状态码用来表明特定HTTP请求是否成功完成。响应有以下五大类:
1xx:信息响应(100-199)
2xx:成功响应(200-299)
3xx:重定向消息(300-399)
4xx:客户端错误响应(400-499)
5xx:服务端错误响应(500-599)
常见的状态码包括:200、301、403、405、404、500、502、504等
状态码 | 含义 |
---|---|
100 Continue | 这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。 |
101 Switching Protocols | 该代码是响应客户端的 Upgrade 请求头发送的,指明服务器即将切换的协议。 |
102 Processing (WebDAV) | 此代码表示服务器已收到并正在处理该请求,但当前没有响应可用。 |
103 Early Hints | 此状态代码主要用于与 Link 链接头一起使用,以允许用户代理在服务器准备响应阶段时开始预加载 preloading 资源。 |
200 OK | 请求成功。成功的含义取决于 HTTP 方法,如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。 |
201 Created | 该请求已成功,并因此创建了一个新的资源。这通常是在 POST 请求,或是某些 PUT 请求之后返回的响应。 |
202 Accepted | 请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。 |
203 Non-Authoritative Information | 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。 |
204 No Content | 对于该请求没有的内容可发送,但头部字段可能有用。用户代理可能会用此时请求头部信息来更新原来资源的头部缓存字段。 |
205 Reset Content | 告诉用户代理重置发送此请求的文档。 |
206 Partial Content | 当从客户端发送Range范围标头以只请求资源的一部分时,将使用此响应代码。 |
207 Multi-Status (WebDAV) | 对于多个状态代码都可能合适的情况,传输有关多个资源的信息。 |
208 Already Reported (WebDAV) | 在 DAV 里面使用 dav:propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。 |
226 IM Used (HTTP Delta encoding) | 服务器已经完成了对资源的GET请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。 |
300 Multiple Choice | 请求拥有多个可能的响应。用户代理或者用户应当从中选择一个。(没有标准化的方法来选择其中一个响应,但是建议使用指向可能性的 HTML 链接,以便用户可以选择。) |
301 Moved Permanently | 请求资源的 URL 已永久更改。在响应中给出了新的 URL。 |
302 Found | 此响应代码表示所请求资源的 URI 已 暂时 更改。未来可能会对 URI 进行进一步的改变。因此,客户机应该在将来的请求中使用这个相同的 URI。 |
303 See Other | 服务器发送此响应,以指示客户端通过一个 GET 请求在另一个 URI 中获取所请求的资源。 |
304 Not Modified | 这是用于缓存的目的。它告诉客户端响应还没有被修改,因此客户端可以继续使用相同的缓存版本的响应。 |
307 Temporary Redirect | 服务器发送此响应,以指示客户端使用在前一个请求中使用的相同方法在另一个 URI 上获取所请求的资源。这与 302 Found HTTP 响应代码具有相同的语义,但用户代理 不能 更改所使用的 HTTP 方法:如果在第一个请求中使用了 POST,则在第二个请求中必须使用 POST |
308 Permanent Redirect | 这意味着资源现在永久位于由Location: HTTP Response 标头指定的另一个 URI。这与 301 Moved Permanently HTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST,则必须在第二个请求中使用 POST。 |
400 Bad Request | 由于被认为是客户端错误(例如,错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求。 |
401 Unauthorized | 虽然 HTTP 标准指定了"unauthorized",但从语义上来说,这个响应意味着"unauthenticated"。也就是说,客户端必须对自身进行身份验证才能获得请求的响应。 |
402 Payment Required 实验性 | 此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准约定。 |
403 Forbidden | 客户端没有访问内容的权限;也就是说,它是未经授权的,因此服务器拒绝提供请求的资源。与 401 Unauthorized 不同,服务器知道客户端的身份。 |
404 Not Found | 服务器找不到请求的资源。在浏览器中,这意味着无法识别 URL。在 API 中,这也可能意味着端点有效,但资源本身不存在。服务器也可以发送此响应,而不是 403 Forbidden,以向未经授权的客户端隐藏资源的存在。这个响应代码可能是最广为人知的,因为它经常出现在网络上。 |
405 Method Not Allowed | 服务器知道请求方法,但目标资源不支持该方法。例如,API 可能不允许调用DELETE来删除资源。 |
406 Not Acceptable | 当 web 服务器在执行服务端驱动型内容协商机制后,没有发现任何符合用户代理给定标准的内容时,就会发送此响应。 |
407 Proxy Authentication Required | 类似于 401 Unauthorized 但是认证需要由代理完成。 |
408 Request Timeout | 此响应由一些服务器在空闲连接上发送,即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接。由于一些浏览器,如 Chrome、Firefox 27+ 或 IE9,使用 HTTP 预连接机制来加速冲浪,所以这种响应被使用得更多。还要注意的是,有些服务器只是关闭了连接而没有发送此消息。 |
409 Conflict | 当请求与服务器的当前状态冲突时,将发送此响应。 |
410 Gone | 当请求的内容已从服务器中永久删除且没有转发地址时,将发送此响应。客户端需要删除缓存和指向资源的链接。HTTP 规范打算将此状态代码用于“有限时间的促销服务”。API 不应被迫指出已使用此状态代码删除的资源。 |
411 Length Required | 服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它。 |
412 Precondition Failed | 客户端在其头文件中指出了服务器不满足的先决条件。 |
413 Payload Too Large | 请求实体大于服务器定义的限制。服务器可能会关闭连接,或在标头字段后返回重试 Retry-After。 |
414 URI Too Long | 客户端请求的 URI 比服务器愿意接收的长度长。 |
415 Unsupported Media Type | 服务器不支持请求数据的媒体格式,因此服务器拒绝请求。 |
416 Range Not Satisfiable | 无法满足请求中 Range 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。 |
417 Expectation Failed | 此响应代码表示服务器无法满足 Expect 请求标头字段所指示的期望。 |
418 I’m a teapot | 服务端拒绝用茶壶煮咖啡。笑话,典故来源茶壶冲泡咖啡 |
421 Misdirected Request | 请求被定向到无法生成响应的服务器。这可以由未配置为针对请求 URI 中包含的方案和权限组合生成响应的服务器发送。 |
422 Unprocessable Entity (WebDAV) | 请求格式正确,但由于语义错误而无法遵循。 |
423 Locked (WebDAV) | 正在访问的资源已锁定。 |
424 Failed Dependency (WebDAV) | 由于前一个请求失败,请求失败。 |
425 Too Early 实验性 | 表示服务器不愿意冒险处理可能被重播的请求。 |
426 Upgrade Required | 服务器拒绝使用当前协议执行请求,但在客户端升级到其他协议后可能愿意这样做。 服务端发送带有Upgrade 字段的 426 响应 来表明它所需的协议(们)。 |
428 Precondition Required | 源服务器要求请求是有条件的。此响应旨在防止’丢失更新’问题,即当第三方修改服务器上的状态时,客户端 GET 获取资源的状态,对其进行修改并将其 PUT 放回服务器,从而导致冲突。 |
429 Too Many Requests | 用户在给定的时间内发送了太多请求(“限制请求速率”) |
431 Request Header Fields Too Large | 服务器不愿意处理请求,因为其头字段太大。在减小请求头字段的大小后,可以重新提交请求。 |
451 Unavailable For Legal Reasons | 用户代理请求了无法合法提供的资源,例如政府审查的网页。 |
500 Internal Server Error | 服务器遇到了不知道如何处理的情况。 |
501 Not Implemented | 服务器不支持请求方法,因此无法处理。服务器需要支持的唯二方法(因此不能返回此代码)是 GET and HEAD. |
502 Bad Gateway | 此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。 |
503 Service Unavailable | 服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。请注意,与此响应一起,应发送解释问题的用户友好页面。这个响应应该用于临时条件和如果可能的话,HTTP 标头 Retry-After 字段应该包含恢复服务之前的估计时间。网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。 |
504 Gateway Timeout | 当服务器充当网关且无法及时获得响应时,会给出此错误响应。 |
505 HTTP Version Not Supported | 服务器不支持请求中使用的 HTTP 版本。 |
506 Variant Also Negotiates | 服务器存在内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当终点。 |
507 Insufficient Storage (WebDAV) | 无法在资源上执行该方法,因为服务器无法存储成功完成请求所需的表示。 |
508 Loop Detected (WebDAV) | 服务器在处理请求时检测到无限循环。 |
510 Not Extended | 服务器需要对请求进行进一步扩展才能完成请求。 |
511 Network Authentication Required | 指示客户端需要进行身份验证才能获得网络访问权限。 |
HTTP协议请求方式
HTTP协议中的请求方式(也称为HTTP方法或HTTP动作)是客户端(如浏览器)向服务器发送请求时,用来指定对请求资源所希望执行的操作的。
ps:基本概念(安全和幂等)
安全:请求方法不会破坏服务器上的资源。
幂等:多次执行相同的操作,结果都是相同的。
请求方式 | 用途 | 特点 |
---|---|---|
GET | 请求指定的页面信息,并返回实体内容。这是最常用的HTTP请求方法之一,主要用于请求数据。 | 请求的数据会附加在URL之后,并且URL的长度受到限制(一般在1024字节左右)。GET请求是安全且幂等的,即多次请求同一资源应返回相同的结果,且不会对资源状态产生影响。 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。POST请求通常用于提交数据给服务器进行处理,可能导致新的资源建立或原有资源修改。 | 请求的数据被包含在请求体中,不受URL长度限制。POST请求不是幂等的,因为它可能会修改服务器上的资源。 |
HEAD | 类似于GET请求,只不过返回的响应体中没有具体内容,只有报文头。HEAD请求通常用于获取资源的元信息(如内容类型、长度等),而不实际获取资源本身。 | HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。 |
PUT | 从客户端向服务器传送的数据取代指定的内容,即向指定的位置上传最新的内容。PUT请求通常用于更新资源。 | PUT请求是幂等的,如果多次发送相同的PUT请求,资源的状态应该是相同的。 |
DELETE | 请求服务器删除Request-URL所标识的资源。 | DELETE请求用于删除资源,是幂等的,因为删除同一个资源多次与删除一次的效果相同。 |
OPTIONS | 返回服务器针对特殊资源所支持的HTTP请求方法,或允许客户端查看服务器的性能。 | OPTIONS请求可以用于探测目标资源所支持的HTTP方法,以及服务器的其他特性。 |
PATCH | 对PUT方法的补充,用来对已知资源进行局部更新。 | PATCH请求比PUT请求更加灵活,因为它只更新资源的部分内容,而不是整个资源。 |
CONNECT | HTTP/1.1中预留给能够将连接改为管道方式的代理服务器。CONNECT方法主要用于SSL加密服务器的代理。 | 有简洁而灵活得架构,强大的网络处理能力,兼容各种HTTP方法,具有丰富的扩展性,是该晓得数据交换桥梁。 |
TRACE | 回显服务器收到的请求,主要用于测试和诊断。 | TRACE请求允许客户端查看服务器收到的请求的原始格式,这有助于调试和测试。 |
此外,还有一些不太常见的HTTP请求方式,如MOVE、COPY、LINK、UNLINK等,它们主要用于WebDAV(Web-based Distributed Authoring and Versioning)等高级应用场景。
在实际应用中,GET和POST请求是最常用的HTTP请求方式。GET请求主要用于请求数据,而POST请求主要用于提交数据给服务器进行处理。其他请求方式则根据具体的应用场景和需求来选择使用。
HTTP无状态协议是什么
HTTP无状态协议指的是HTTP协议对于事务处理没有记忆能力。具体来说,服务器在处理每个HTTP请求时,不会保留关于客户端或之前请求的任何状态信息。每个请求都被视为独立的,服务器根据请求中包含的信息进行处理,并返回响应,而不会将任何状态信息保存到后续的请求中。
这种无状态的设计简化了服务器的设计1,使得服务器可以更容易地扩展2和容错3。然而,在某些情况下,如需要保持用户登录状态或跨请求传递数据时,无状态协议就显得不够灵活。
怎么解决HTTP无状态协议的问题
- 使用Cookie
Cookie是服务器发送到客户端并保存在客户端本地的一小段数据。它允许服务器在客户端上存储少量数据,并在后续的请求中检索这些数据。通过Cookie,服务器可以识别出返回的用户,从而保持用户的登录状态或传递其他必要的信息。注意:虽然Cookie很有用,但它们也存在一些限制,如大小限制(通常为4KB)和安全性问题(如Cookie欺骗)。 - 使用Session
Session是一种在服务器端存储用户会话信息的方式。当客户端首次与服务器建立连接时,服务器会创建一个唯一的Session ID,并将其发送给客户端(通常通过Cookie实现)。在后续的请求中,客户端会将Session ID发送给服务器,服务器根据Session ID检索对应的会话信息。Session允许服务器在多个请求之间保持状态,但需要注意的是,Session数据是存储在服务器上的,因此会占用服务器的资源。 - HTTP持久连接(Keep-Alive)
虽然HTTP持久连接本身并不解决无状态问题,但它可以减少因频繁建立和关闭TCP连接而产生的开销。在持久连接中,客户端和服务器之间的TCP连接在发送和接收完一个HTTP请求/响应后不会立即关闭,而是保持一段时间以便发送后续的请求/响应。这可以提高网络传输的效率,但并不能解决HTTP无状态协议带来的状态管理问题。 - Token认证
在现代Web应用中,Token认证成为了一种流行的解决方案。客户端在登录时,服务器会返回一个Token(通常是一个加密的字符串),客户端在后续的请求中会将这个Token放在HTTP头部发送给服务器。服务器通过验证Token来识别客户端的身份和状态。Token认证比Cookie更加安全,因为它不会存储在客户端的磁盘上,而是存储在内存中或作为一个请求头部发送。同时,Token可以包含更多的信息,如用户权限等。
HTTP和HTTPS的区别
关键点 | HTTP | HTTPS |
---|---|---|
安全性 | 使用明文传输数据,不提供任何方式的数据加密,安全性较差。请求和响应不会对通信方进行确认,无法保护数据的完整性,传输内容容易被窃取或篡改。 | 通过SSL/TLS协议对数据进行加密和身份验证,确保数据传输的安全性。HTTPS能够防止数据在传输过程中被窃取或篡改,同时提供服务器身份验证,防止用户连接到假冒网站。 |
数据传输方式 | 以明文方式发送内容,所有传输的数据都是未加密的。 | 在HTTP的基础上,通过SSL/TLS协议对数据进行加密处理,确保数据在传输过程中的安全性。 |
端口号 | 默认使用TCP协议的80端口。 | 默认使用TCP协议的443端口。 |
是否需要证书 | 不需要 | 需要向CA(证书颁发机构)申请SSL/TLS证书,并安装在服务器上。证书费用因证书类型和颁发机构而异,一般免费证书较少,需要交费。 |
性能影响 | 由于不需要进行加密和解密操作,因此性能相对较好。 | 由于需要对数据进行加密和解密操作,因此会增加一定的计算开销和传输延迟,对性能有一定影响。但随着硬件性能的提升和SSL/TLS协议的优化,这种影响已经逐渐减小。 |
应用场景 | 通常用于传输静态网页、图片、音频、视频等内容,以及对这些静态资源的请求和获取。在公开信息传输、开发和调试等场景中也有广泛应用。 | 被广泛应用在需要传输用户登录信息、信用卡信息、个人健康记录或其他敏感信息的网站和应用程序中。如电子商务网站、银行网站、电子邮件服务等。 |
为什么有了HTTP还要HTTPS
虽然 HTTP 是广泛应用的网络协议,但它存在安全隐患。HTTP 以明文传输数据,易被拦截读取,且无法验证通信双方身份,易受中间人攻击;而 HTTPS 加入了 SSL/TLS 协议,能对数据加密,通过数字证书进行服务器身份验证,增加用户信任度,确保数据完整性,防止被篡改。随着互联网发展和安全意识提高,越来越多的网站从 HTTP 切换到 HTTPS,以保护用户隐私和数据安全。
GET和POST区别
- 数据传输方式不一样。GET方法通过URL传递参数4,数据是可见的,并且会受到URL长度的限制5;POST通过HTTP消息体(body)传输数据,而不是URL。在这种方式下,数据对用户不可见,且没有长度限制。
- 安全性有差异。GET通过URL明文传输,数据容易被捕获和篡改,不适合传输敏感信息。同时GET请求的记录会留在浏览器的历史记录和服务器日志中,增加了数据泄露的风险;POST通过HTTP消息体传输,相对更安全。POST请求不会将数据留在浏览器的历史记录中,且服务器日志中也可能不包含完整的请求数据(取决于服务器配置)。然而,需要注意的是,HTTP协议本身并不加密数据,因此POST请求传输的数据仍然可以被截获。为了增强安全性,应使用HTTPS协议来加密传输的数据。
- 缓存性不同:GET请求是可以被缓存的。如果两个GET请求具有相同的URL(包括查询字符串),则浏览器可能会从缓存中直接获取响应,而不是向服务器发送新的请求。这有助于提高页面加载速度并减少服务器负载;POST请求通常不会被缓存。因为POST请求通常用于提交表单数据或执行其他需要修改服务器状态的操作,这些操作的结果不应该被缓存。
- 后退页面的反应不同:当用户从使用GET请求的页面后退时,GET再次发送相同请求时,由于缓存存在,可能从缓存中获取数据,这通常不会对用户产生明显影响;当用户从使用POST请求的页面后退时,浏览器通常会提示用户重新提交表单数据。
- GET请求幂等,POST请求通常不幂等:GET请求是幂等的,即多次执行相同的GET请求应该返回相同的结果(不考虑缓存和服务器状态变化);POST请求通常不是幂等的,因为每次执行POST请求都可能导致服务器状态的改变(例如,提交表单数据并保存到数据库)。
- 编码方式不同:GET请求通常只支持URL编码(也称为百分比编码),用于将特殊字符转换为可安全传输的格式;POST请求支持多种编码方式,包括application/x-www-form-urlencoded(类似于GET请求的URL编码)、multipart/form-data(用于文件上传)和application/json(用于发送JSON格式的数据)等。
- GET可以被收藏为书签,POST不能:在 HTTP 协议中,GET 请求通常用于获取资源,其参数显示在 URL 中,直观易记且具有幂等性,相对安全的同时使得用户可以放心重复访问,所以能被收藏为书签;而 POST 请求主要用于提交数据进行处理,参数在请求体中传输更安全但不便于直观记忆,且通常非幂等,多次提交可能产生不同结果,所以不适合收藏为书签。
- GET产生一个TCP数据包;POST产生两个TCP数据包:对于GET请求,通常情况下,GET 请求只是向服务器请求获取数据,请求参数一般在 URL 中,数据量相对较小。浏览器会在发送请求时,将请求头和请求数据一起封装在一个 TCP 数据包中发送出去,所以通常产生一个 TCP 数据包;对于POST请求,POST 请求主要用于向服务器提交大量数据,比如提交表单数据、上传文件等。首先,浏览器会先发送一个请求头给服务器,告知服务器即将有一个 POST 请求以及一些基本信息,这个过程产生一个 TCP 数据包。服务器收到这个请求头后,做好接收数据的准备,然后浏览器再发送包含实际数据的请求体,这又产生一个 TCP 数据包。所以 POST 请求通常会产生两个 TCP 数据包。
减少了内存和存储需求,降低了复杂性,提高了可维护性。由于服务器不需要存储每个客户端的会话状态信息,因此不需要为每个客户端分配内存或存储资源来保存这些状态。这大大减少了服务器在内存和存储方面的需求,使得服务器的设计更加简洁。无状态的设计使得服务器只需要关注当前请求的内容,并根据请求内容进行处理和响应,而不需要考虑之前的请求或状态信息。这降低了服务器的处理逻辑和状态管理的复杂性,使得服务器的设计和实现更加容易。由于无状态设计减少了服务器内部的依赖和状态管理,因此在维护服务器时,不需要担心状态信息的同步和一致性问题。这提高了服务器的可维护性和稳定性。 ↩︎
可横向扩展,实现负载均衡,可根据实际需求进行弹性伸缩。在无状态设计中,每个请求都是独立的,因此可以很容易地将请求分发到多个服务器上进行处理。这种横向扩展的方式可以显著提高系统的处理能力和吞吐量,满足高并发场景下的需求。由于每个请求都是独立的,因此可以很方便地实现负载均衡。负载均衡器可以根据服务器的负载情况和请求内容,将请求分发到不同的服务器上进行处理,从而平衡服务器的负载,提高系统的整体性能。在云计算和虚拟化技术日益成熟的今天,无状态设计使得服务器可以根据实际需求进行弹性伸缩。当系统负载增加时,可以自动增加服务器的数量来分担负载;当负载减少时,可以自动减少服务器的数量以节省资源。 ↩︎
能够故障隔离,可快速恢复,能够简化处理。在无状态设计中,由于每个请求独立,因此当某个服务器出现故障时,其他服务器仍然可以正常处理请求。这种故障隔离的机制可以减少单点故障对整个系统的影响。当服务器出现故障时,由于无状态设计使得服务器之间不依赖于彼此的状态信息,因此可以很容易地将请求转移到其他正常的服务器上进行处理。这种快速恢复的能力可以保证系统的连续性和可用性。由于每个请求都是独立的,因此在处理请求时出现的错误不会影响到其他请求的处理。这简化了错误处理逻辑,使得系统可以更加稳定地运行。 ↩︎
即将需要传递的数据附加在URL后面,以查询字符串的形式发送。 ↩︎
通常为2048个字符左右,但具体限制可能因浏览器和服务器而异。 ↩︎