HTTP相关知识点
什么是HTTP?
-
HTTP(超文本传输协议:HyperText Transfer Protocol),是一种用于分布式、协作式和超媒体信息系统的应用层协议。
-
HTTP是万维网的数据通信的基础,设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
-
通过HTTP或HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。
一次HTTP请求主要包括请求和响应,即由用户代理程序和源服务器之间的信息交流。
-
用户代理程序(user agent):我们通过某种方式(如浏览器)发送一个HTTP请求到服务器的指定端口上,我们称帮助我们发送请求的应用程序(客户端)成为用户代理程序。
-
源服务器:我们请求资源的服务器就是源服务器,源服务器一般存储我们所需要的资源(如HTML文件和图片)。
由用户代理程序向源服务器发送请求携带的信息称为请求报文(request message)。由源服务器对用户代理程序的响应携带的信息称为响应报文(response message)。
HTTP的版本
HTTP的版本有0.9、1.0、1.1、2.0、3.0
它们之间的区别:
-
HTTP/0.9
- 只支持GET请求获取文本数据, 主要仅仅是为了获取HTML文件。
-
HTTP/1.0
- 支持GET、POST、HEAD等请求,支持请求头、响应头等,支持更多的种信息传递的数据类型,不再仅仅局限于文本数据。
- 在1.0版本中每次请求都需要与服务器建立一个TCP链接,请求处理完后断开TCP链接,每次建立连接的开销较大。如果想进行持久连接,需要在请求头和响应头中都添加Connection: keep-alive。
-
HTTP/1.1
- 此版本是使用最广泛的。
- 增加了PUT、DELETE等请求方法
- 默认采用持久连接(Connection: keep-alive),即一次TCP连接中请求处理完后可以选择保持一定事件的状态,放便下一次请求也可以使用,即多个请求可以共用一个TCP连接,但不同的WEB服务器的保持时间是不同的。
-
HTTP/2.0
- 提升网络性能,依赖TCP优化,显著提升加载速度。
-
HTTP/3.0
- 提升安全性,传输协议变为依赖基于UDP的QUIC协议,较少丢包率。
- 但需要服务器和客户端同时支持。
HTTP的请求方式
在RFC(Request For Comments)中定义了一组请求方式:
-
GET: GET方法请求一个指定资源的表现形式,一般用于获取数据。
-
HEAD:HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体。
- 比如在准备下载一个文件前,通过HEAD方法可以先获取文件的大小,再决定是否进行下载,在一定程度上可以优化下载。
-
POST:POST方法用请求有效载荷(payload)替换目标资源的所有当前表示。
- 一般用于添加数据。
-
PUT:PUT方法用请求有效载荷替换目标资源的所有当前表示。
- 一般用于修改数据整体。
-
DELETE:DELETE方法一般用于删除指定的资源。
-
PATCH: PATCH方法一般用于与资源部分修改。
-
CONNECT:CONNECT方法建立一个到目标资源标识的服务器的隧道,通常用在代理服务器,网页开发很少用到。
-
TRACE:TRACE方法沿着到目标资源的路径执行一个消息的环回测试。
HTTP常见的请求头
-
Content-type: type是这次请求携带的数据的类型,服务器可以根据其判断怎样解析数据。
- application/x-www-form-urlencoded:表示数据被编码成以’&‘分割的键值队,同时以’='分割键和值。即通过form表单提交的数据。
- application/json:表示传输的数据是一个JSON类型。
- application/xml:表示传输的数据是一个XML类型。
- text/plain:表示传输的数据是文本类型。
- multipart/form-data:表示是上传文件。
-
Content-length:文件的大小长度。
- 前面提到过HEAD请求是没有响应体的,他的一个使用场景就是可以先获取文件大小Content-length,再决定是否进行下载,从而优化下载。
-
Connection: keep-alive
- http是基于TCP协议的,但是在1.1之前每一次请求都需要经历TCP的连接和断开,这样频繁的连接和断开时非常耗性能的。
- 在1.0时期,可以手动进行持久连接,需要在请求头和响应头中都添加Connection: keep-live,当客户端再次发送请求时,就会使用同一个连接,直到一方断开连接。
- 在1.1版本中,所有连接默认是Connection: keep-alive的,不同的Web服务器的保持时间是不同的。但可以通过
Keep-Alive: timeout=xxx
进行单独设置。
-
accept-encoding: 告知服务器,客户端支持的压缩格式。
-
accept: 告知服务器,客户端可接受文件的格式类型。
-
user-agent: 客户端相关的信息。
关于accept和accept-encoding,是客户端传递给服务器可以接收的文件格式和压缩格式,服务器会先根据Accept选择内容格式,再根据Accept-Encoding决定是否压缩,最终返回格式正确且经过压缩(若支持)的响应。
HTTP的常见的响应状态码
MDN:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Status
-
200(OK):客户端请求成功。
-
201(Created):POST请求,创建新的资源成功。
-
301(Moved Permanently):请求资源的URL已经修改,响应中会给出新的URL,浏览器会根据给出的URL重定向到新的URL。
-
400(Bad Request):客户端的错误,服务器无法处理或者不进行处理。
-
401(Unauthorized):未授权的错误,必须携带请求的身份信息。
-
403(Forbidden):客户端没有访问权限,被拒绝。
-
404(Not Found):服务器找不到请求的资源。
-
500(Internal Server Error):服务器遇到了不知道如何处理的问题。
-
503(Serive Unavailable):服务器不可用,可能出于维护或重载状态,暂时无法访问。
在开发中,一般都会采用返回200状态码,但会自定义响应信息,统一客户端处理逻辑。