HTTP报文

通过本文可以了解编写自己的 HTTP 应用程序所需掌握的大部分内容。具体来说,你会理解下列概念:

  • 报文是如何流动的;
  • HTTP 报文的三个组成部分(起始行、首部和实体的主体部分);
  • 请求和响应报文之间的区别;
  • 请求报文支持的各种功能(方法);
  • 和响应报文一起返回的各种状态码;
  • 各种各样的 HTTP 首部都是用来做什么的。

报文流

  • HTTP 报文是在HTTP 应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动

  • HTTP 使用术语流入(inbound)和流出(outbound)来描述事务处理(transaction)的方向

  • 不管是请求报文还是响应报文,所有报文都会向下游(downstream)流动

报文的组成部分

HTTP报文的组成部分:对报文进行描述的起始行、包含属性的头部块、可选的,包含数据的主体部分


HTTP 报文的三个部分
  • 起始行
    

报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

  •  首部字段
    

起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

  •   主体
    

空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

报文的语法

所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。

  • 请求报文
    它会向Web服务器请求一个动作

  • 请求报文的格式:
    起始行: <method> <request-URL> <version>
    头部: <headers>
    主体: <entity-body>

  • 响应报文
    它会将请求的结果返回给客户端。

  • 响应报文的格式:
    起始行: <version> <status> <reason-phrase>
    头部: <headers>
    主体: <entity-body>

下面是对各部分的简要描述:
1、方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如,GET、POST或HEAD

2、请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径就可以了,服务器可以假定自己是URL的主机/端口

3、版本(version):报文所使用的HTTP版本。其格式:HTTP/<主要版本号>.<次要版本号>

4、状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(比如,“成功”、“出错”等等)

5、原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义,因此,尽管响应行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短语的含义不同,但同样都会被当作成功指示处理

6、头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始

7、实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。

展示一些假想的请求和响应报文:

image.png

起始行

  • 请求行
    请求报文请求服务器对资源进行一些操作。请求报文的起始行,或称为请求行,包含了一个方法和一个请求URL,这个方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中还包含HTTP 的版本,用来告知服务器,客户端使用的是哪种HTTP。所有这些字段都由空格符分隔
  • 响应行
    响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或称为响应行,包含了响应报文使用的HTTP 版本、数字状态码,以及描述操作状态的文本形式的原因短语。 所有这些字段都由空格符进行分隔。
    例如:HTTP/1.1 200 OK

首部

  • 每个HTTP 首部都有一种简单的语法:名字后面跟着冒号(:),然后跟上可选的空格,再跟上字段值,最后是一个CRLF。(或者换行符)
    常见的首部实例
image.png
  • 首部延续行
    将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或制表符(tab)。
    HTTP/1.0 200 OK
    Content-Type: image/gif
    Content-Length: 8572
    Server: Test Server
    Version 1.0
    在这个例子中,响应报文里包含了一个 Server 首部,其值被划分成了多个延续行。
    该首部的完整值为 Test Server Version 1.0。
  • 通用首部
    这些是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应
    用程序之间提供一些非常有用的通用功能。比如,Date 首部就是一个通用首部,
    每一端都可以用它来说明构建报文的时间和日期:
    Date: Tue, 3 Oct 1974 02:16:00 GMT
  • 请求首部
    从名字中就可以看出,请求首部是请求报文特有的。它们为服务器提供了一些额
    外信息,比如客户端希望接收什么类型的数据。例如,下面的Accept 首部就用
    来告知服务器客户端会接受与其请求相符的任意媒体类型:
    Accept: /
    Accept首部
image.png

安全请求首部


image.png
  • 响应首部
    响应报文有自己的首部集,以便为客户端提供信息(比如,客户端在与哪种类型
    的服务器进行交互)。例如,下列Server 首部就用来告知客户端它在与一个版
    本1.0 的Tiki-Hut 服务器进行交互:
    Server: Tiki-Hut/1.0
  • 实体首部
    实体首部指的是用于应对实体主体部分的首部。比如,可以用实体首部来说明实
    体主体部分的数据类型。例如,可以通过下列Content-Type 首部告知应用程
    序,数据是以iso-latin-1 字符集表示的HTML 文档:
    Content-Type: text/html; charset=iso-latin-1
    内容首部
image.png
  • 扩展首部
    扩展首部是非标准的首部,由应用程序开发者创建,但还未添加到已批准的
    HTTP 规范中去。即使不知道这些扩展首部的含义,HTTP 程序也要接受它们并
    对其进行转发。

方法

常见的http方法



最常接触的方法是HEAD GET POST。
1.GET
通常用于请求服务器发送某个资源。



2.HEAD
HEAD 方法与GET 方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。

使用HEAD,可以:在不获取资源的情况下
· 了解资源的情况(比如,判断其类型);
· 通过查看响应中的状态码,看看某个对象是否存在;
· 通过查看首部,测试资源是否被修改了。



3.post
通常用于向服务器提交数据。表单提交常常用到post。

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

推荐阅读更多精彩内容