Web协议(3)HTTP消息--请求与响应详解

HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰

  • 请求(requests):由客户端发送用来触发一个服务器上的动作
  • 响应(responses):来自服务器的应答。

HTTP 请求和响应具有相似的结构,由以下部分组成︰
  1. 起始行:用于描述要执行的请求,或者是对应的响应状态。这个起始行总是单行的。
  2. HTTP头部:一个可选的HTTP头集合指明请求或描述消息正文
  3. 空行:指示所有关于请求的元数据已经发送完毕。
  4. 正文:包含请求相关数据 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定。

HTTP头部和正文是可选的(optional)。
起始行和HTTP头部统称为请求头部(the head of the requests)。

基于ABNF的HTTP协议格式:

1. HTTP请求

1.1 起始行

request-line = method SP request-target SP HTTP-version CRLF

  1. method
    • 一个动词 (像 GETPUT 或者 POST)
    • 一个名词 (像 HEAD 或者 OPTIONS), 描述要执行的动作.
方法 用途
GET 请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。 使用 GET 的请求应该只被用于获取数据。如果 请求的资源是文本,那就保持原样返回;如果是像 CGI那样的程序,则返回经过执行后的输出结果。
HEAD 请求一个与GET请求的响应相同的响应,但客户端只返回响应头部不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
POST 用于将实体(如HTML FORM)提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT 用来传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。鉴于 HTTP/1.1PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般 的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用 REST标准的同类 Web 网站,就可能会开放使用 PUT 方法。
DELETE 删除指定的资源。HTTP/1.1DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的。
CONNECT 建立一个到由目标资源标识的服务器的隧道。要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSLTLS协议把通信内容加密后经网络隧道传输。
OPTIONS 用于显示目标资源针对请求 URI 指定的资源支持的方法。
TRACE 让 Web 服务器端将之前的请求通信环回给客户端的。客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改 / 篡改的。
PATCH 用于对资源应用部分修改。

用于文档管理的WebDav方法:
[瞎写个]:这里写注释

方法 用途
PROPFIND 从Web资源中检索以 XML格式存储的属性。它也被重载,以允许一个检索远程系统的集合结构(也叫目录层次结构 。)
PROPPATCH 在单个原子性动作中更改和删除资源的多个属性
MKCOL 创建集合或者目录
COPY 将资源从一个URI 复 制到另一个URI
MOVE 将资源从一个URI移动到另一个 URI
LOCK 锁定一个资源 。WebDAV 支持共享锁和互斥锁 。
UNLOCK 解除资源的锁定
  1. request-target:通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是:
  • origin-form = absolute-path ["?" query ]:
    一个绝对路径,末尾跟上一个 ' ? ' 和查询字符串 ' query = ' 。path 为空时必须有'/'。被 GETPOSTHEADOPTIONS 方法所使用。

POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0

  • absolute-form = absolute-URI:
    一个完整的URL,主要在使用 GET 方法连接到代理时使用。

GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1

  • authority-form = authority:
    由域名和可选端口(以':'为前缀)组成的 URL 的 authority component。 仅在使用 CONNECT 建立 HTTP 隧道时才使用。

CONNECT developer.mozilla.org:80 HTTP/1.1

  • asterisk-form = "*":
    不是访问特定资源而是对服务器本身发起请求,可以用一个简单的星号('*') 来代替请求 URI。
    配合 OPTIONS 方法使用,查询 HTTP 服务器端支持 的 HTTP 方法种类。

OPTIONS * HTTP/1.1

  1. HTTP-version: 定义了剩余报文的结构,作为对期望的响应版本的指示符。

1.2 HTTP头部

有许多请求头可用,它们可以分为几组:

  • General headers,例如 Via,适用于整个报文。
  • Request headers,例如User-AgentAccept-Type,通过进一步的定义(例如 Accept-Language),或者给定上下文(例如 Referer),或者进行有条件的限制 (例如 If-None) 来修改请求。
  • Entity headers,例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

1.3 正文

不是所有的请求都有一个 body

  • 不需要body的请求:获取资源的请求,GETHEADDELETEOPTIONS
  • 需要body的请求:将数据发送到服务器以便更新数据的请求,POST 请求(包含 HTML 表单数据)。

2. HTTP 响应

2.1 状态行

status-line = HTTP-version SP status-code SP reason-phrase CRLF
  status-code = 3 DlGlT
  reason-phrase = HTAB / SP / VCHAR / abs-text )

HTTP 响应的起始行被称作 状态行 (status line),包含以下信息:

  1. HTTP-version:通常为 HTTP/1.1。
  2. status code:表明请求是成功或失败。
  3. reason-phase:一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

2.1 HTTP头部

响应头可以分为几组:

  • General headers:例如 Via,适用于整个报文。
  • Response headers:例如 VaryAccept-Ranges,提供其它不符合状态行的关于服务器的信息。
  • Entity headers:例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。

2.1 正文

不是所有的响应都有 body,具有状态码 (如 201204) 的响应通常不会有 body。

Body 大致可分为三类:

  • Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-TypeContent-Length
  • Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked来使用 chunks 编码。
  • Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容