# 基础概念
| 请求报文
GET http://www.example.com/ HTTP/1.1Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cache-Control: max-age=0Host: www.example.comIf-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMTIf-None-Match: "3147526947+gzip"Proxy-Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 xxxparam1=1¶m2=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>
// 省略…
- 第一行包含协议版本、状态码以及描述。- 接下来多行也是首部内容。- 一个空行分隔首部和内容主体。- 最后是响应的内容主体。<a name="N7IbI"></a>## | 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 来定位资源。<a name="n6bNM"></a># # HTTP 请求方法<a name="TcuFC"></a>## * GET请求指定的页面信息,并返回实体主体。当前网络请求中,大部分使用 GET 方法。<a name="fsBA2"></a>## * POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 可能会导致新的资源的建立和/或已有资源的修改。<a name="dNgB8"></a>## * PUT从客户端向服务器传送的数据取代指定文档的内容。> 由于 PUT 本身不带验证机制,所以任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。```httpPUT /new.html HTTP/1.1Host: example.comContent-type: text/htmlContent-length: 16<p>New File</p>
* PATCH
PATCH 允许修改部分文档。
PATCH /file.txt HTTP/1.1Host: www.example.comContent-Type: application/exampleIf-Match: "e0023aa4e"Content-Length: 100[description of changes]
* DELETE
请求服务器删除指定的页面或者文件。
DELETE 和 PUT 功能相反,同样不带验证机制。
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,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT www.example.com:443 HTTP/1.1
* 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 首部
四种类型:通用首部字段、请求首部字段、响应首部字段和实体首部字段。# 参考
