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状态码,但会自定义响应信息,统一客户端处理逻辑。