HTTP的详解

发布于:2024-12-07 ⋅ 阅读:(30) ⋅ 点赞:(0)
  1. HTTP 的基本概念

    (1)定义

     
    • HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说,它是在互联网上进行数据传输的规则,主要用于客户端和服务器之间的通信,使得客户端(如浏览器)能够从服务器获取网页、图片、视频等各种资源。
    • 例如,当你在浏览器中输入一个网址(如https://www.example.com)并按下回车键,浏览器就会通过 HTTP 协议向服务器发送请求,服务器接收到请求后,根据请求的内容返回相应的网页数据,浏览器再将这些数据解析并显示出来。

    (2)版本演变

     
    • HTTP/0.9 是最早的版本,它的功能非常简单,仅支持请求获取 HTML 文档,没有请求头和响应头,也没有状态码。
    • HTTP/1.0 在 0.9 的基础上进行了扩展,增加了请求头和响应头,使得可以传输除 HTML 以外的其他文件类型,如图片、样式表等,同时还引入了状态码来表示请求的结果。但 1.0 版本每次请求都需要建立一个新的 TCP 连接,这在一定程度上影响了性能。
    • HTTP/1.1 是目前广泛使用的版本,它对 1.0 进行了优化,支持持久连接(Connection: keep - alive),一个 TCP 连接可以用于多次请求和响应,减少了建立连接的开销。同时还新增了许多功能,如管道化(Pipelining),可以在一个 TCP 连接上发送多个请求而不用等待每个请求的响应,进一步提高了性能。
    • HTTP/2.0 在性能方面有了更大的提升,它采用二进制格式进行数据传输,而不是 HTTP/1.x 的文本格式,这样更高效且不易出错。并且引入了多路复用(Multiplexing)技术,一个连接可以同时处理多个请求和响应,解决了 HTTP/1.1 中管道化的队头阻塞(Head - of - Line Blocking)问题,大大提高了并发处理能力。
  2. HTTP 的请求和响应结构

    (1)请求结构

     
    • 请求行(Request - Line):它包含了请求方法、请求的 URL 和 HTTP 协议版本。例如,GET /index.html HTTP/1.1,这里GET是请求方法,表示获取资源;/index.html是请求的资源路径;HTTP/1.1是协议版本。
    • 请求头(Request - Headers):包含了许多关于请求的附加信息,如User - Agent(客户端浏览器的类型和版本)、Accept(客户端能够接受的内容类型)、Cookie(存储在客户端的一些用户信息)等。例如,User - Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36,这个请求头告诉服务器客户端使用的是 Chrome 浏览器。
    • 请求体(Request - Body):不是所有的请求都有请求体。一般在 POST 等请求方法中会包含请求体,用于向服务器发送数据,如提交表单数据、上传文件等。请求体的内容格式可以根据Content - Type请求头来确定,如application/x - www - form - urlencoded(表单数据)、multipart/form - data(文件上传)等。

    (2)响应结构

     
    • 响应行(Response - Line):包含 HTTP 协议版本、状态码和状态码的文本描述。例如,HTTP/1.1 200 OK,这里200是状态码,表示请求成功;OK是状态码对应的文本描述。
    • 响应头(Response - Headers):包含了关于响应的各种信息,如Content - Type(响应内容的类型,如text/html)、Content - Length(响应内容的长度)、Set - Cookie(设置客户端的 Cookie)等。例如,Content - Type: text/html; charset=UTF - 8,这个响应头告诉客户端响应的内容是 HTML 文档,字符编码是 UTF - 8。
    • 响应体(Response - Body):包含了服务器返回的实际内容,如网页的 HTML 代码、图片的二进制数据、JSON 格式的数据等。客户端根据响应头中的Content - Type来解析响应体的内容。
  3. HTTP 请求方法

    (1)GET

     
    • GET 方法用于从服务器获取资源。它是最常用的请求方法,当你在浏览器中输入网址并访问网页时,浏览器通常会发送 GET 请求。GET 请求的特点是请求参数会附加在 URL 后面,以?开头,多个参数之间用&连接。例如,https://www.example.com/search?keyword=java&page=1,这里keyword=javapage=1是请求参数。由于请求参数会暴露在 URL 中,所以 GET 方法一般用于获取数据,而不适合用于传输敏感信息。
    • GET 请求是幂等的,这意味着多次执行相同的 GET 请求应该得到相同的结果,不会对服务器的数据产生副作用。

    (2)POST

     
    • POST 方法用于向服务器提交数据,通常用于表单提交、文件上传等场景。与 GET 不同,POST 请求的数据是放在请求体中的,不会暴露在 URL 上,所以更适合传输敏感信息。例如,当你在一个登录页面输入用户名和密码并点击登录按钮时,浏览器会向服务器发送一个 POST 请求,将用户名和密码放在请求体中发送给服务器。
    • POST 请求不是幂等的,每次执行 POST 请求可能会对服务器的数据产生不同的影响,如插入一条新的记录到数据库中。

    (3)PUT

     
    • PUT 方法用于将数据上传到服务器指定的位置,通常用于更新资源。如果目标资源不存在,PUT 请求可能会创建一个新的资源。例如,在一个文件存储系统中,通过 PUT 请求可以将一个本地文件更新到服务器上指定的文件路径。PUT 请求是幂等的,多次执行相同的 PUT 请求应该得到相同的结果。

    (4)DELETE

     
    • DELETE 方法用于请求服务器删除指定的资源。例如,在一个资源管理系统中,可以通过 DELETE 请求删除一个文件或者一个用户记录。DELETE 请求也是幂等的,多次执行相同的 DELETE 请求应该得到相同的结果,即资源被删除后,再次执行 DELETE 请求不会产生额外的影响。

    (5)其他请求方法

     
    • HEAD 方法与 GET 方法类似,但服务器只返回响应头,不返回响应体。它主要用于获取资源的元信息,如资源是否存在、资源的类型等。
    • OPTIONS 方法用于获取服务器针对特定资源所支持的请求方法列表,客户端可以通过这个方法来了解服务器的功能,以便正确地发送请求。
  4. HTTP 状态码

    (1)1xx(信息性状态码)

     
    • 这些状态码主要用于提供信息,表示请求已经被服务器接收,正在处理中。例如,100 Continue,当客户端发送一个包含请求体的请求(如 POST 请求)时,先发送请求头,服务器如果返回100 Continue,则表示服务器已经收到请求头,客户端可以继续发送请求体。

    (2)2xx(成功状态码)

     
    • 这是最常见的一类状态码,表示请求成功被服务器接收、理解并处理。
    • 200 OK:表示请求成功,服务器成功返回了客户端请求的资源。例如,当浏览器请求一个网页,服务器正确返回了网页的 HTML 代码时,会返回200 OK
    • 201 Created:表示请求成功并且服务器创建了一个新的资源。通常在使用 POST 或 PUT 请求创建或更新资源后返回。例如,当成功插入一条新记录到数据库后,服务器可以返回201 Created

    (3)3xx(重定向状态码)

     
    • 这类状态码表示客户端需要进行额外的操作才能完成请求,通常是需要进行重定向。
    • 301 Moved Permanently:表示请求的资源已经永久移动到了新的位置,服务器返回新的 URL,客户端以后应该使用新的 URL 进行访问。例如,一个网站更换域名后,旧域名下的资源可以通过301 Moved Permanently重定向到新域名下对应的资源。
    • 302 Found(或者307 Temporary Redirect):表示请求的资源临时移动到了新的位置,客户端应该使用新的 URL 进行临时访问。与301不同的是,302307只是临时重定向,下次访问可能还会回到原来的位置。

    (4)4xx(客户端错误状态码)

     
    • 这些状态码表示客户端发送的请求有问题,如请求的资源不存在、请求方法不被允许等。
    • 400 Bad Request:表示客户端发送的请求语法错误,服务器无法理解。例如,请求参数格式错误或者请求头不符合要求等情况。
    • 401 Unauthorized:表示客户端请求的资源需要进行身份验证,但客户端没有提供有效的认证信息或者认证失败。例如,访问一个需要登录的页面但没有登录时,会返回401 Unauthorized
    • 403 Forbidden:表示服务器理解了请求,但拒绝执行。这可能是因为客户端没有权限访问请求的资源,与401不同的是,403不是因为缺少认证信息,而是即使提供了认证信息也不被允许访问。例如,用户权限不足,无法访问某些敏感资源。
    • 404 Not Found:这是最常见的客户端错误状态码之一,表示服务器无法找到客户端请求的资源。可能是因为 URL 错误、资源被删除等原因。

    (5)5xx(服务器错误状态码)

     
    • 这类状态码表示服务器在处理请求时出现了错误。
    • 500 Internal Server Error:表示服务器内部出现错误,无法完成请求。这可能是由于服务器代码错误、数据库故障等原因导致的。例如,服务器端的程序在执行过程中抛出了未处理的异常时,会返回500 Internal Server Error
    • 503 Service Unavailable:表示服务器暂时无法处理请求,通常是因为服务器过载、维护或者其他临时问题导致的。例如,在高流量时期,服务器资源耗尽,无法响应新的请求时,会返回503 Service Unavailable