@Dale-Lin
2021-02-03T20:28:23.000000Z
字数 4054
阅读 1173
HTTP
HTTP 使用术语流入(inbound)和流出(outbound)来描述事务处理(transaction)的方向。
流向服务器称为流入;流向用户Agent代理称为流出。
报文的流动方向是从上到下:
所有报文都向下流动。
HTTP报文由三部分组成:
message | section |
---|---|
HTTP1.0 200 OK | start line |
Content-type: text/plain Content-length: 19 |
header |
Hi! | body |
请求报文:
<method> <request-URLPath> <version>
<headers>
<entity-body>
例如:
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
响应报文:
<version> <status> <reason-phrase>
<headers>
<entity-body>
例如:
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
两者只是起始行语法不同。
request-URLPath
命名了所请求资源,或者URL 的 path 组件。服务器会假定自己是URL的主机/端口,对 path 进行解析。
这样在一台主机有多个虚拟主机的情况下难以确定是请求哪个主机,就需要 HTTP/1.1 的 Host 头来指明虚拟主机是哪个。
version
报文所用的 HTTP 版本,格式如下:
HTTP/<major>.<minor>
其中主要版本号和次要版本号都是整数。
方法 | 描述 | 是否包含主体 |
---|---|---|
GET | 从服务器获取一份文档 | 否 |
HEAD | 只从服务器获取文档的首部 | 否 |
POST | 向服务器发送需要处理的数据 | 是 |
PUT | 将请求的主体存储在服务器上 | 是 |
TRACE | 对可能经过代理服务器传送到服务器上的报文进行追踪 | 否 |
OPTIONS | 决定可以在服务器上执行哪些方法 | 否 |
DELETE | 从服务器上删除一份文档 | 否 |
并不是所有服务器都实现了上表中的方法。
出这些方法外,服务器可能会实现一些自己的请求方法,称为扩展方法。
4.状态码
用于告知客户端安生了什么事情,位于响应报文起始行中。
可以通过3位数字对不同状态码进行分类:
整体范围 | 已定义 | 分类 |
---|---|---|
100~199 | 100~101 | 信息提示 |
200~299 | 200~206 | 成功 |
300~399 | 300~305 | 重定向 |
400~499 | 400~415 | 客户端错误 |
500~599 | 500~505 | 服务器错误 |
如果收到了不认识的状态码,可能是扩展定义的状态,从整体范围分类判断即可。
状态码 | 原因短语 | 含义 |
---|---|---|
100 | Continue | 说明收到了请求的初始部分,请客户端继续。服务器发送这个状态码后,收到请求必须继续响应 |
101 | Switching protocols | 服务器正在根据客户端的指定,将协议切换成 Update 首部所列的协议 |
HTTP header向请求和响应报文中添加了一些附加信息。本质是名值对的列表。
首部 | 描述 |
---|---|
Connection | 允许客户端和服务器指定和连接有关的选项(例如: Upgrade、Keep-Alive、close) |
Date | 提供时间日期 |
Transfer-Encoding | 告知报文的编码方式(例如: chunked) |
Cache-control | 缓存指示 |
Pragma | 不专用于缓存(no-cache) |
首部 | 描述 |
---|---|
Client-IP | 运行客户端的机器的 IP |
Host | 接受请求的服务器的主机名和端口号 |
Referer | 告知服务器客户端从哪里获得其请求的 URL |
首部 | 描述 |
---|---|
Accept | 告诉服务器能发送哪些媒体类型,如:image/png, image/* |
Accept-Charset | 告诉服务器能发送哪些字符集 |
Accept-Encoding | 告诉服务器能发送哪些压缩方式,如:gzip, deflate |
Accept-Language | 告诉服务器能发送哪些语言 |
首部 | 描述 |
---|---|
If-Modified-Since | 除非资源在某日期后已修改,否则限制这个请求 |
If-None-Match | 如果提供的实体标记与当前文档的不符,就获取文档 |
首部 | 描述 |
---|---|
Authorization | 包含了客户端提供给服务器,以对其进行认证的数据 |
Content-Security-Policy | 允许获取的资源的源 |
Cookie | 客户端传送一个 cookie |
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Public | 服务器为其资源支持的请求方法列表 |
Server | 服务器应用程序软件的名称和版本 |
Retry-After | 如果资源不可用,在此日期后重试 |
首部 | 描述 |
---|---|
Proxy-Authenticate | 来自代理的对客户端的质询列表 |
Set-Cookie | 在客户端设置一个 cookie,以便服务器对客户端进行标识(一条 cookie 对应一个 Set-Cookie 首部) |
首部 | 描述 |
---|---|
Allow | 列出了可对此实体执行的请求方法 |
Location | 重定向的 URL |
Content-Encoding | 对主体执行的压缩方式 |
Content-Length | 主体长度 |
Content-Range | 在整个资源中此实体表示的字节范围 |
Content-Type | 此主体的对象类型 |
Content-Language | 理解主体时最适宜使用的语言 |
Etag | 与此实体相关的实体标记 |
Expires | 实体不再有效的日期和时间 |
Last-Modified | 此实体最后一次被修改的日期和时间 |
每个HTTP首部以一个CRLF(回车)结束。
常见的首部实例:
首部实例 | 描述 |
---|---|
Date:Tue,3Oct 1997 02:16:03 GMT | 服务器产生响应的日期 |
Content-length:15040 | 实体的主体部分包含了15040字节的数据 |
Content-type:image/gif | 实体的主体部分是一个GIF图片 |
Accept: image/gif, image/jpeg, text/html | 客户端可以接收GIF图片和JPEG图片以及HTML |
2. 首部延续行
长首部合理换行可以提高可读性,但是延续行必须缩进:
Server: Test Server
Version 1.0
可以为任何类型的数字数据。
GET 和 HEAD 方法都被认为是安全的,意味着使用 GET 或 HEAD 方法的 HTTP 请求都不会在服务器上产生什么结果。
安全方法并不一定是什么动作都不执行,取决于 Web 开发者。
GET
最常用的方法,通常用于请求服务器发送某个资源。
HEAD
与 GET 行为类似,但服务器的响应报文只返回首部,不返回主体。作用有:
与 GET 方法相反,会向服务器写入文档(储存)。
让服务器用请求主体的主体部分来创建一个由所请求的 URL 命名的新文档。
如果 URL 已存在,则替换。
向服务器发送数据。通常会用它来支持 HTML 的表单。
表单中填好的数据通常会被发送给服务器,然后由服务器将其发送到它要去的地方。
客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关或一些应用程序。每个中间节点都可能会修改原始的 HTTP 请求。
TRACE 方法允许客户端在最终将请求发送给服务器时,看它变成了什么样子。
TRACE 请求会在目的服务器端发起一个“环回”诊断。行程的最后一个服务器会在(TRACE响应的)响应主体中携带它收到的请求报文。
TRACE 方法主要用于诊断,但有缺点,且不能带有实体的主体部分。
请求服务器告知其支持的方法,或对某些特殊资源支持哪些方法。
请求服务器删除 URL 指定的资源。
但是客户端app不能保证删除操作一定会被执行。HTTP 规范允许服务器在不通知客户端的情况下撤销请求。
常见的扩展方法(WebDAV HTTP扩展)有:
方法 | 描述 |
---|---|
LOCK | 允许用户锁定资源,可以在编辑时锁定,防止别人同时修改 |
MKCOL | 允许用户创建资源(make collection) |
COPY | 在服务器上复制资源 |
MOVE | 在服务器上移动资源 |
如果能在不破坏端到端行为的情况下将带有未知方法的报文传递给下游服务器,代理应该尝试传递这些报文。如果可能破坏端到端行为,则应响应 501 Not Implemented(无法实现)