# 先对HTTP规范入个门。
# 概述
HTTP (Hypertext transfer protocol) 翻译成中文是超文本传输协议,是网络中计算机与计算机之间通过网络进行数据出传输的一种规范。
这里的超文本已经不在局限于文本,还包含图片,音频,视频。
HTTP 最早是在 1991 年发布了 0.9 版,然后又在 1996 年发布 1.0 版,1997 年是 1.1 版,2015 年发布了 2.0 版,2018 年发布了 3.0 版。随着版本的升级,其特性也在不断的增强,但到目前为止 HTTP/1.1 这个版本依旧是应用最广泛版本。
# 请求 URL
URL 是统一资源定位符,是互联网资源位置的标识方式。我们通常会基于 http 规范通过指定的 url 访问网络中的资源,其 url 语法格式如下:
protocol://hostname:port/directory/filename?name=value#anchor
部分 | 含义 |
---|---|
protocol | 访问资源使用的协议,如:http,https,ftp,telnet 等。 |
hostname | 服务器的主机名称,IP地址。 |
port | 访问的端口号,默认为80。 |
directory | 访问资源的目录名称。 |
filename | 访问的资源名称。 |
?name=value | 访问资源时的参数和参数值 |
#anchor | 访问当前资源的锚点。 |
# HTTP 消息
http 消息可以分为请求消息和响应消息,但无论是请求消息还是响应消息,都可以将其分成三部分,分别为消息头、空行、消息体。如图所示:
# HTTP 请求消息
http 请求消息是基于 http 协议发送请求时,携带的请求数据,包括请求行,请求头,空行,请求消息体,如图所示:
# 请求行
请求行是请求消息头中的第一行,其语法结构如下:
request-method-name request-URI HTTP-version
其中:
request-method-name:表示请求方式(如GET,POST)。
request-URI:表示请求统一资源标识(不含主机部分)。
HTTP-version:表示HTTP协议版本(如HTTP/1.1)。
请求行案例分析:
GET /test.html HTTP/1.1
HEAD /query.html HTTP/1.0
POST /index.html HTTP/1.1
常用请求方式分析:
GET 表示请求服务端资源。
HEAD 请求服务端资源,但没有响应体。
POST 在服务端创建资源。
PUT 更新服务端目标资源。
PATCH 用于对资源应用部分修改。
DELETE 删除服务端指定的资源。
CONNECT 建立到由目标资源的隧道。
OPTIONS 描述目标资源的通信选项。
TRACE 消息环回测试。
# 请求头
请求头由一些键值(key/value)对构成,一个key还可以对应多个值,其语法结构如下:
request-header-name: request-header-value1, request-header-value2, ...
例如:
Host: www.xyz.com
Connection: Keep-Alive
Accept: image/gif, image/jpeg, */*
Accept-Language: us-en, fr, cn
常见报头如下表所示:
报头名称 | 含义 |
---|---|
User-Agent(简称:UA) | 用户代理。允许将客户端信息告诉服务器。 |
Host | 请求资源的主机和端口号,可从URL中获取。 |
Accept | 允许客户端接受哪些类型的信息。如image/gif, text/html ,/(所有类型)。 |
Accept-Language | 客户端可以接受的语言类型。 |
Accept-Encoding | 指定可接受的内容压缩编码类型。 |
Accept-Charset | 指定客户端接受的字符集。 |
Cookie | 传输到服务器端的COOKIE数据。 |
Connection | 连接类型。 |
Cache-Control | 控制缓存。 |
Referer | 可以记录访问的来源,统计访问量。 |
# 请求消息体
请求正文信息,比方说发送 post 请求时,可以将客户端要提交的表单部分内容放在这里传递到服务端。
综合案例分析:
POST /user HTTP/1.1
Host: www.xy.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)
id=10&name=tony
# HTTP 响应消息
HTTP 响应消息由状态行、响应头、空行、响应消息体构成。如图所示:
# 响应状态行
响应行是响应消息头中的第一行,其语法结构如下:
HTTP-version status-code reason-phrase
HTTP-version 为协议版本。
status-code 为响应状态码。
reason-phrase 为响应描述。
响应状态行案例分析:
HTTP/1.1 200 OK
HTTP/1.0 404 Not Found
HTTP/1.1 403 Forbidden
响应状态码由三位数字组成,第一位数字定义了响应类别,例如:
1xx:表示请求已接收,继续处理。
2xx:表示请求已被服务端成功处理。
3xx:表示请求需更进一步的操作。
4xx:客户端请求不正确。
5xx:服务器处理请求时错误。
常见状态码分析:
200 OK.请求响应成功。
302 临时重定向。
304 服务内容没有变化。
400 当前请求无法被服务器理解。
401 当前请求需要用户验证。
403 客户端无权访问资源。
404 请求资源不存在。
405 请求方式不被允许。
406 无法解析服务端返回的数据。
408 请求超时。
413 请求实体太大。
415 不支持的媒体类型。
500 服务器发生不可预见错误。
503 服务暂时不可用。
504 网关请求超时。
# 响应头
响应头用于告诉浏览器,应当怎样处理响应数据,其语法也是键值对结构。
response-header-name: response-header-value1, response-header-value2, ...
响应头案例分析:
Content-Type: text/html
Content-Length: 35
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
部分响应头部含义如下:
响应报头 | 含义 |
---|---|
Date | 告诉浏览器,请求页面的时间 |
Server | 服务器软件信息 |
Content-Length | 回送数据的字节数 |
Content-Type | 回送内容的类型 |
Expires | 表示存在时间,允许客户端在这个给时间之前不检查(发请求) |
Cache-Control | 缓存控制 |
X-Powered-By | 版权信息(程序支持) |
Keep-Alive | 连接类型 |
Location | 响应报头域用于重定向到一个新的位置 |
Refresh | 页面刷新时间 |
Last-modified | 指定服务器上保存内容的最后修订时间 |
# 响应消息体
响应正文信息,服务端一般会将要响应到客户端的正文信息放在这里,然后传递到客户端。
综合案例分析:
HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov xxxx
ETag: "a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
(blank line)
<html><body><h1>It works!</h1></body></html>
参考资料: