HTTP报文是在HTTP应用程序之间发送的数据块,这些数据块以一些文本形式的元信息开头,这些元信息描述了报文的内容,后面跟着可选的数据部分。
不管是请求报文还是响应报文,所有的报文都会向下游游动,所有的报文发送者都在接受者的上游。报文是简单的格式化数据块,它们由三部分构成:描述报文的起始行、包含属性的首部、可选的数据主体。起始行和首部都是由行分隔的ASCII文本,每一行都以回车换行结束。报文的数据主体是可选的,主体中可以包含文本数据或者二进制数据,也可以是空。
所有的报文可以归纳为两类:请求报文、相应报文。请求报文向web服务器请求一个动作,相应报文会将请求报文的结果返回给客户端。
请求报文格式如下:
<method> <url> <version>
<headers>
<body>
响应报文格式如下:
<version> <status> <phrase>
<headers>
<entity-body>
method是客户端希望对web服务器执行的动作,比如POST/GRT等,url是客户端请求的资源,version是报文所使用的http版本,类似http/<major>.<minor> 期中major是主版本号,minor是次版本号。status是状态码,反应了请求过程所发生的状况,用三位数字表示,phrase是数字状态码的可读版本,人们看起来更直观一些。headers可以有零个或者多个,每个首部包含一个名字,然后是一个冒号,接着是可选的空格,接着是值,最后以回车换行结尾。headers以空行表示结束。表示首部的结束和实体主体的开始。entity-body是实体的主体部分,主体可以由任何数据组成。
所有的http报文都是以一个起始行开始。请求报文的起始行包含一个方法和一个url,方法描述了web服务器应该执行的动作,url表示要对那个资源执行该方法,期中还包含http的版本。而响应报文的起始行则包含了相应报文的http版本,状态码,以及描述操作状态的可读短语。
HTTP规定了一组常用的请求方法,如下:
GET 获取web服务器资源
HEAD 从web服务器获取文档的首部
POST 给web服务器发送要处理的数据
PUT 将请求的主体部位分存储在服务器上
TRACE 对可能经过的代理进行跟踪
OPTIONS 决定在服务器上可以执行哪些方法
DELETE 删除服务器上的文档
并不是所有的服务器都支持这7种方法。GET和HEAD被认为是安全方法,因为它们执行多次,而结果都一样,GET通常用于请求服务器发送某个资源,HEAD与GET类似,但服务器只返回首部,而不返回实体的主体部分,这样就允许客户端在未实际获取资源的情况下,可以对首部进行检查。PUT方法会向服务器写入文档,PUT方法的语义就是让服务器用请求主体部分来创建一个由所请求的URL命名的文档。POST方法是用来向服务器输入数据的,通常用来支持HTML的表单。OPTIONS方法请求web服务器告知其支持的各种功能,这样客户端不用实际访问那些资源就能判定访问各个资源的最优方式。DELETE方法是请求服务器删除url所指定的文档,但是不一定保证成功,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。
状态码告诉客户端发生了什么事,位于响应报文的起始行中,状态码分类如下:
100~199 提示信息
200~299 成功
300~399 重定向
400~499 客户端错误
500~599 服务器错误
301在请求的url已经被移除时,响应的location首部中应该包含该资源现在所处的url。302与301类似,但是客户端应该使用location首部给出的url来临时定位资源。
HTTP首部向请求和响应报文中添加了一些附加信息,本质来说他们只是一些kry/value对,首部分为通用首部、请求首部、响应首部、实体首部、扩展首部。每个HTTP首部都是一个名字后面跟着冒号,然后是可选的空着,最后是字段值。有时候一个首部的信息过多,一行无法显示,则可以用多行表示,不过多出来的每一行前面至少要有一个空格。
HTTP实体的主体是HTTP报文的负载,就是HTTP要传输的内容,可以承载很多类型的数据,文本、二进制、图片、视频等等。