[关闭]
@Dale-Lin 2021-02-03T20:28:23.000000Z 字数 4054 阅读 1173

HTTP Message(报文)

HTTP


报文流

HTTP 使用术语流入(inbound)和流出(outbound)来描述事务处理(transaction)的方向。
流向服务器称为流入;流向用户Agent代理称为流出。

报文的流动方向是从上到下:

Created with Raphaël 2.1.2客户端客户端代理1代理1代理2代理2服务器服务器请求(流向下游)请求(流向下游)请求(流向下游)相应(流向下游)相应(流向下游)相应(流向下游)

所有报文都向下流动。


报文的组成

HTTP报文由三部分组成:

message section
HTTP1.0 200 OK start line
Content-type: text/plain
Content-length: 19
header
Hi! body

报文的语法

  1. 请求报文:
    <method> <request-URLPath> <version>
    <headers>

    <entity-body>

    例如:

  1. GET / HTTP/1.1
  2. Host: developer.mozilla.org
  3. Accept-Language: fr
  1. 响应报文:
    <version> <status> <reason-phrase>
    <headers>

    <entity-body>

    例如:

  1. HTTP/1.1 200 OK
  2. Date: Sat, 09 Oct 2010 14:28:02 GMT
  3. Server: Apache
  4. Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
  5. ETag: "51142bc1-7449-479b075b2891b"
  6. Accept-Ranges: bytes
  7. Content-Length: 29769
  8. Content-Type: text/html
  9. <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)

两者只是起始行语法不同。

起始行

  1. 请求行
    包含一个方法和一个请求 URL,还包含HTTP的版本。
    这些字段由空格分隔。
  2. 响应行
    包含响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。
    这些字段由空格分隔。HTTP1.0版本状态码200表示成功。
  3. 方法
    请求的起始行以方法作为开始。
    HTTP规范中定义了一组常用的请求方法。
方法 描述 是否包含主体
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 开发者。

PUT

与 GET 方法相反,会向服务器写入文档(储存)。

让服务器用请求主体的主体部分来创建一个由所请求的 URL 命名的新文档。

如果 URL 已存在,则替换。

POST

向服务器发送数据。通常会用它来支持 HTML 的表单。
表单中填好的数据通常会被发送给服务器,然后由服务器将其发送到它要去的地方。

TRACE

客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关或一些应用程序。每个中间节点都可能会修改原始的 HTTP 请求。
TRACE 方法允许客户端在最终将请求发送给服务器时,看它变成了什么样子。

TRACE 请求会在目的服务器端发起一个“环回”诊断。行程的最后一个服务器会在(TRACE响应的)响应主体中携带它收到的请求报文。

TRACE 方法主要用于诊断,但有缺点,且不能带有实体的主体部分。

OPTIONS

请求服务器告知其支持的方法,或对某些特殊资源支持哪些方法。

DELETE

请求服务器删除 URL 指定的资源。

但是客户端app不能保证删除操作一定会被执行。HTTP 规范允许服务器在不通知客户端的情况下撤销请求。

扩展方法

常见的扩展方法(WebDAV HTTP扩展)有:

方法 描述
LOCK 允许用户锁定资源,可以在编辑时锁定,防止别人同时修改
MKCOL 允许用户创建资源(make collection)
COPY 在服务器上复制资源
MOVE 在服务器上移动资源

如果能在不破坏端到端行为的情况下将带有未知方法的报文传递给下游服务器,代理应该尝试传递这些报文。如果可能破坏端到端行为,则应响应 501 Not Implemented(无法实现)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注