基础概念

请求报文

1
2
3
4
5
6
7
8
9
10
11
12
13
GET http://www.example.com/ HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: www.example.com
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx

param1=1&param2=2
  • 第一行是包含了请求方法、URL、协议版本。
  • 接下来的多行都是请求首部 Header,每个首部都有一个首部名称,以及对应的值。
  • 一个空行用来分隔首部和内容主体 Body。
  • 最后是请求的内容主体。

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HTTP/1.1 200 OK
Age: 529651
Cache-Control: max-age=604800
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 648
Content-Type: text/html; charset=UTF-8
Date: Mon, 02 Nov 2020 17:53:39 GMT
Etag: "3147526947+ident+gzip"
Expires: Mon, 09 Nov 2020 17:53:39 GMT
Keep-Alive: timeout=4
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Proxy-Connection: keep-alive
Server: ECS (sjc/16DF)
Vary: Accept-Encoding
X-Cache: HIT

<!doctype html>
<html>
<head>
<title>Example Domain</title>
// 省略...
</body>
</html>
  • 第一行包含协议版本、状态码以及描述。
  • 接下来多行也是首部内容。
  • 一个空行分隔首部和内容主体。
  • 最后是响应的内容主体。

URI、URL、URN

  • URI:统一资源标志符(Uniform Resource Identifier)在电脑术语中是用于标志某一互联网资源名称的字符串。
  • URL:统一定位资源(Uniform Resource Locator)俗称网页地址,简称网址,是因特网上标准的资源的地址。
  • URN:统一资源名称(Uniform Resource Name)是 URI 的历史名字,URN 用来寻找特定名称空间资源来补充网址。

URI 可被视为 URL 或 URN 或两者的结合。URN 如同一个人的名称,而 URL 代表一个人的住址。URN 定义某事物的身份,而 URL 提供查找该事物的方法。

HTTP 使用 URL 来定位资源。

HTTP 请求方法

HTTP 请求方式一共有 9 种,分别为:GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD、CONNECT和TRACE。

  • GET:请求指定的页面信息,并返回实体主体。大部分网络请求方式都为 GET。

  • POST:向指定资源提交数据进行处理请求,例如提交表单或者上传文件,数据被包含在请求体中。POST 可能会导致新的资源的建立和/或已有资源的修改。

  • PUT:从客户端向服务器传送数据从而取代指定文档的内容。因为 PUT 本身不带验证机制,任何人都可以上传文件,所以存在安全性问题,一般不使用 PUT 方法。

    1
    2
    3
    4
    5
    6
    PUT /new.html HTTP/1.1
    Host: example.com
    Content-type: text/html
    Content-length: 16

    <p>New File</p>
  • DELETE:请求服务器删除指定的页面或者文件,和 PUT 方法一样不带验证机制,所以不安全。

    1
    DELETE /file.html HTTP/1.1
  • PATCH:允许修改部分的文档。

    1
    2
    3
    4
    5
    6
    7
    PATCH /file.txt HTTP/1.1
    Host: www.example.com
    Content-Type: application/example
    If-Match: "e0023aa4e"
    Content-Length: 100

    [description of changes]
  • OPTIONS:查询指定 URL 支持的请求方法,返回例如Allow: GET, POST, HEAD, OPTIONS,也允许客户端查看服务器的性能。

  • HEAD:类似于 GET 请求,但是返回的响应中没有实体主体部分。主要用于获取报头、确认 URL 的有效性以及资源更新的日期时间等信息。

  • CONNECT:是HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器的请求方式。该方式使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

    1
    CONNECT www.example.com:443 HTTP/1.1

    image.png

  • TRACE:服务器将通信路径返回给客户端,主要用来回显服务器收到的请求并测试或者侦听。TRACE 发送请求时会在 Max-Forwards 首部字段中填入数值,每经过一个服务器数值减 1,当数值为 0 时就停止传输。使用 TRACE 容易受到跨站攻击,所以通常不使用这种方式。

HTTP 状态码

HTTP 状态码主要为 5 类,分别为信息性状态码 1xx、成功状态码 2xx、重定向状态码 3xx、客户端错误状态码 4xx 和服务器错误状态码 5xx。

1xx 信息性

1xx 表示接收到的请求正在处理。

  • 100 Continue:表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。

2xx 成功

2xx 表示请求正常处理完毕。

  • 200 OK:请求成功处理。
  • 204 No Content:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。204 一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
  • 206 Partial Content:表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。

3xx 重定向

3xx 表示需要进行附加操作以完成请求。

  • 301 Moved Permanently:永久性重定向。
  • 302 Found:临时性重定向。
  • 303 See Other:和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
  • 304 Not Modified:请求报文首部有时会包含一些条件,如果不满足条件,则服务器会返回 304 状态码。常见的条件有 if-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since。
  • 307 Temporary Redirect:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。

虽然 HTTP 协议规定 301、302 和 303 状态下不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会把 POST 方法改成 GET 方法。

4xx 客户端错误

4xx 表示服务器无法处理客户端的请求,客户端发送错误。

  • 400 Bad Request:请求报文中存在语法错误。
  • 401 Unauthorized:该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
  • 403 Forbidden:请求被拒绝。
  • 404 Not Found:服务器无法根据客户端的请求找到网页或者资源。

5xx 服务器错误

5xx 表示服务器处理请求出错,错误发生在服务器。

  • 500 Internal Server Error :服务器正在执行请求时发生错误。
  • 502 bad gateway:网关错误,已经和后端建立了连接,但是超时。
  • 503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
  • 504 gateway time-out:网关超时,尚未和后端建立连接。

HTTP 首部

四种类型:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

参考

  1. HTTP|CS-Note
  2. wikipedia:URI
  3. http状态码502与504区别