# 基础概念

| 请求报文

  1. GET http://www.example.com/ HTTP/1.1
  2. 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
  3. Accept-Encoding: gzip, deflate
  4. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  5. Cache-Control: max-age=0
  6. Host: www.example.com
  7. If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
  8. If-None-Match: "3147526947+gzip"
  9. Proxy-Connection: keep-alive
  10. Upgrade-Insecure-Requests: 1
  11. User-Agent: Mozilla/5.0 xxx
  12. param1=1&param2=2
  • 第一行是包含了请求方法、URL、协议版本。
  • 接下来的多行都是请求首部 Header,每个首部都有一个首部名称,以及对应的值。
  • 一个空行用来分隔首部和内容主体 Body。
  • 最后是请求的内容主体。

    | 响应报文

    ```http 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>

// 省略…

  1. - 第一行包含协议版本、状态码以及描述。
  2. - 接下来多行也是首部内容。
  3. - 一个空行分隔首部和内容主体。
  4. - 最后是响应的内容主体。
  5. <a name="N7IbI"></a>
  6. ## | URI、URL、URN
  7. - **URI:**统一资源标志符(Uniform Resource Identifier)在电脑术语中是用于标志某一互联网资源名称的字符串。
  8. - **URL:**统一定位资源(Uniform Resource Locator)俗称网页地址,简称网址,是因特网上标准的资源的地址。
  9. - **URN:**统一资源名称(Uniform Resource Name)是 URI 的历史名字,URN 用来寻找特定名称空间资源来补充网址。
  10. > URI 可被视为 URL URN 或两者的结合。URN 如同一个人的名称,而 URL 代表一个人的住址。URN 定义某事物的身份,而 URL 提供查找该事物的方法。
  11. >
  12. > HTTP 使用 URL 来定位资源。
  13. <a name="n6bNM"></a>
  14. # # HTTP 请求方法
  15. <a name="TcuFC"></a>
  16. ## * GET
  17. 请求指定的页面信息,并返回实体主体。当前网络请求中,大部分使用 GET 方法。
  18. <a name="fsBA2"></a>
  19. ## * POST
  20. 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 可能会导致新的资源的建立和/或已有资源的修改。
  21. <a name="dNgB8"></a>
  22. ## * PUT
  23. 从客户端向服务器传送的数据取代指定文档的内容。
  24. > 由于 PUT 本身不带验证机制,所以任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
  25. ```http
  26. PUT /new.html HTTP/1.1
  27. Host: example.com
  28. Content-type: text/html
  29. Content-length: 16
  30. <p>New File</p>

* PATCH

PATCH 允许修改部分文档。

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

* DELETE

请求服务器删除指定的页面或者文件。

DELETE 和 PUT 功能相反,同样不带验证机制。

  1. DELETE /file.html HTTP/1.1

* OPTIONS

OPTIONS 查询指定的 URL 所支持的方法,也允许客户端查看服务器的性能。

例:返回Allow: GET, POST, HEAD, OPTIONS

* HEAD

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

服务器将通信路径返回给客户端,主要用来回显服务器收到的请求并测试或者侦听。

发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。

通常不会使用 TRACE,并且它容易受到 CST 攻击(Cross-Site Tracing,跨站追踪)。

# GET 和 POST 区别

  • 功能:
    • GET 请求用于资源获取,是安全且幂等的,安全的意思是仅仅会获取资源而不会影响资源状态,幂等则是对同一 URL 的多次请求应该返回同样的结果。
    • POST 请求主要用来传输数据,多次调用会产生多个新的资源,因此是不安全且非幂等的。
  • 请求数据:
    • GET 请求的数据会包含在 URL 中,而 POST 请求则把数据放置在 HTTP 请求体中。
    • GET 请求可提交的数据量跟 URL 的长度有关,而 POST 请求从理论上讲是没有大小限制,可传较大量的数据。

      # HTTP 状态码

      | 状态码 | 类别 | 含义 | | —- | —- | —- | | 1XX | Informational(信息性状态码) | 接收到的请求正在处理 | | 2XX | Sucess(成功状态码) | 请求正常处理完毕 | | 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | | 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | | 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |

* 1XX 信息

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

    * 2XX 成功

  • 200 OK

  • 204 No Content:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。
  • 206 Partial Content:表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。

    204 一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。

* 3XX 重定向

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

    虽然 HTTP 协议规定 301、302 和 303 状态下不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会把 POST 方法改成 GET 方法。
    304 的条件例如:if-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since。

* 4XX 客户端错误

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

    * 5XX 服务器错误

  • 500 Internal Server Error :服务器正在执行请求时发生错误。

  • 503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

    # HTTP 首部

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

    # 参考

  1. HTTP|CS-Note
  2. wikipedia:URI