# 一 、基础概念
# 1.1 Web 基础
HTTP(HyperText Transfer Protocol,超文本传输协议)。WWW(World Wide Web)的三种技术:HTML、HTTP、URL。RFC(Request for Comments,征求修正意见书),互联网的设计文档。
# 1.2 URL
URI(Uniform Resource Indentifier`,统一资源标识符)URL(Uniform Resource Locator,统一资源定位符)URN(Uniform Resource Name,统一资源名称),例如urn:isbn:0-486-27557-4。
URI包含URL和URN,目前WEB只有URL比较流行,所以见到的基本都是URL。

# 1.3 请求和响应报文
# 1.3.1 请求报文

# 1.3.2. 响应报文

# 二、HTTP 方法
- 客户端发送的 请求报文 第一行为请求行,包含了方法字段。
# 2.1 GET
获取资源
- 当前网络请求中,绝大部分使用的是
GET方法。
# 2.2 HEAD
获取报文首部
- 和
GET方法一样,但是不返回报文实体主体部分。 - 主要用于确认
URL的有效性以及资源更新的日期时间等。
# 2.3 POST
传输实体主体
POST主要用来传输数据,而GET主要用来获取资源。
# 2.4 PUT
上传文件
- 由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16
<p>New File</p>
# 2.5 PATCH
对资源进行部分修改
PUT也可以用于修改资源,但是只能完全替代原始资源,PATCH允许部分修改。
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 100
[description of changes]
# 2.6 DELETE
删除文件
- 与
PUT功能相反,并且同样不带验证机制。
DELETE /file.html HTTP/1.1
# 2.7 OPTIONS
查询支持的方法
- 查询指定的
URL能够支持的方法。 - 会返回
Allow: GET, POST, HEAD, OPTIONS这样的内容。
# 2.8 CONNECT
要求用隧道协议连接代理
- 要求在与代理服务器通信时建立隧道,使用
SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT www.example.com:443 HTTP/1.1

# 2.9 TRACE
追踪路径
- 服务器会将通信路径返回给客户端。
- 发送请求时,在
Max-Forwards首部字段中填入数值,每经过一个服务器就会减1,当数值为0时就停止传输。 - 通常不会使用
TRACE,并且它容易受到XST攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。
# 三、HTTP 状态码
服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
| 状态码 | 类别 | 原因短语 |
|---|---|---|
1XX |
Informational(信息性状态码) |
接收的请求正在处理 |
2XX |
Success(成功状态码) |
请求正常处理完毕 |
3XX |
Redirection(重定向状态码) |
需要进行附加操作以完成请求 |
4XX |
Client Error(客户端错误状态码) |
服务器无法处理请求 |
5XX |
Server Error(服务器错误状态码) |
服务器处理请求出错 |
# 3.1 1XX 信息
- 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
# 3.2 2XX 成功
-
200 OK
-
204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
-
206 Partial Content :表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。
# 3.3 3XX 重定向
-
301 Moved Permanently :永久性重定向
-
302 Found :临时性重定向
-
303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
-
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
-
304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
-
307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
# 3.4 4XX 客户端错误
-
400 Bad Request :请求报文中存在语法错误。
-
401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
-
403 Forbidden :请求被拒绝,服务器端没有必要给出拒绝的详细理由。
-
404 Not Found
# 3.5 5XX 服务器错误
-
500 Internal Server Error :服务器正在执行请求时发生错误。
-
503 Service Unavilable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
# 四、HTTP 首部
有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段
- 各种首部字段及其含义如下(不需要全记,仅供查阅):
# 4.1 通用首部字段
| 首部字段名 | 说明 |
|---|---|
Cache-Control |
控制缓存的行为 |
Connection |
控制不再转发给代理的首部字段、管理持久连接 |
Date |
创建报文的日期时间 |
Pragma |
报文指令 |
Trailer |
报文末端的首部一览 |
Transfer-Encoding |
指定报文主体的传输编码方式 |
Upgrade |
升级为其他协议 |
Via |
代理服务器的相关信息 |
Warning |
错误通知 |
# 4.2 请求首部字段
| 首部字段名 | 说明 |
|---|---|
Accept |
用户代理可处理的媒体类型 |
Accept-Charset |
优先的字符集 |
Accept-Encoding |
优先的内容编码 |
Accept-Language |
优先的语言(自然语言) |
Authorization |
Web 认证信息 |
Expect |
期待服务器的特定行为 |
From |
用户的电子邮箱地址 |
Host |
请求资源所在服务器 |
If-Match |
比较实体标记(ETag) |
If-Modified-Since |
比较资源的更新时间 |
If-None-Match |
比较实体标记(与 If-Match 相反) |
If-Range |
资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since |
比较资源的更新时间(与 If-Modified-Since相反) |
Max-Forwards |
最大传输逐跳数 |
Proxy-Authorization |
代理服务器要求客户端的认证信息 |
Range |
实体的字节范围请求 |
Referer |
对请求中 URI 的原始获取方 |
TE |
传输编码的优先级 |
User-Agent |
HTTP 客户端程序的信息 |
# 4.3 响应首部字段
| 首部字段名 | 说明 |
|---|---|
Accept-Ranges |
是否接受字节范围请求 |
Age |
推算资源创建经过时间 |
ETag |
资源的匹配信息 |
Location |
令客户端重定向至指定 URI |
Proxy-Authenticate |
代理服务器对客户端的认证信息 |
Retry-After |
对再次发起请求的时机要求 |
Server |
HTTP 服务器的安装信息 |
Vary |
代理服务器缓存的管理信息 |
WWW-Authenticate |
服务器对客户端的认证信息 |
# 4.4 实体首部字段
| 首部字段名 | 说明 |
|---|---|
Allow |
资源可支持的 HTTP 方法 |
Content-Encoding |
实体主体适用的编码方式 |
Content-Language |
实体主体的自然语言 |
Content-Length |
实体主体的大小 |
Content-Location |
替代对应资源的 URI |
Content-MD5 |
实体主体的报文摘要 |
Content-Range |
实体主体的位置范围 |
Content-Type |
实体主体的媒体类型 |
Expires |
实体主体过期的日期时间 |
Last-Modified |
资源的最后修改日期时间 |
# 五、具体应用
# 5.1 Cookie
HTTP协议是无状态的,主要是为了让HTTP协议尽可能简单,使得它能够处理大量事务。HTTP/1.1引入Cookie来保存状态信息。Cookie是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且客户端的下一次请求报文会包含该数据。通过Cookie可以让服务器知道两个请求是否来自于同一个客户端,从而实现保持登录状态等功能。
# 5.1.1 创建过程
- 服务器发送的响应报文包含
Set-Cookie字段,客户端得到响应报文后把Cookie内容保存到浏览器中
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
- 客户端之后发送请求时,会从浏览器中读出
Cookie值,在请求报文中包含Cookie字段
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
# 5.1.2 分类
- 会话期
Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。 - 持久性
Cookie:指定一个特定的过期时间(Expires)或有效期(Max-Age)之后就成为了持久性的Cookie。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
# 5.1.3 Set-Cookie
| 属性 | 说明 |
|---|---|
NAME=VALUE |
赋予 Cookie 的名称和其值(必需项) |
expires=DATE |
Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH |
将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 |
作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名) |
Secure |
仅在 HTTPs 安全通信时才会发送 Cookie |
HttpOnly |
加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
# 5.2 缓存
# 5.2.1 优点





