HTTP消息
如果把http比作互联网的快递员,那么http消息就是向全世界发送的包裹。在第一章,我们展示了http程序如何彼此发送消息,从而使得它能工作,在这一章中,将告诉你关于http消息--如何创建他们,以及如何理解他们。在读完这一章之后,你将会明白你自己编写的http应用的大多数细节。尤其是你将理解:
消息如何传输
http消息的三个组成部分(开始行,头部行,主体行)
request和response之间的不同之处
request所支持的一些方法
response 消息返回的状态码
http 头部行做了些什么
消息的传输
http消息是http应用之间传输的数据块,这些数据块以一些元信息(meta-information)文本内容开始,其次是一些可选的数据。这些消息传输与客户端和服务器之间。用术语"inbound","outbound","upstream","downstream"来描述信息传输的方向。http rfc
上游和下游描述了消息的流动:所有消息都从上游流到下游.
向内/向外(inbound/outbound)
向内和向外指的是消息的请求和响应路径:"向内"即"移向源服务器","向外"即"移向用户代理(user agent)".
消息流向源服务器
http常常使用向内(inbound),向外(outbound)来描述传输方向,http消息向内移向源服务器,向外就是移向用户代理(user agent)
消息向内移向源服务器,向外则返回客户端。
消息流向下游
http消息流向像河流。无论它是request消息还是response消息,所有的消息都在向下游流动。消息的发送者也就是上游的接受者。
图3-2,当发送request请求时代理1(proxy1)是上游对于代理3(proxy3)来说,反之,当发送response为下游
3-2
消息的组成部分
http消息是简单的,格式化的数据块。观察一下图3-3这个例子
每一个消息包含一个来自客户端的request请求,和一个来自服务器的响应。他们主要包括三部分:一个开始行描述协议,一个头部行包含属性,和一个主体行包含数据。
开始行和头部行是ascii的文本,一横线分割。每一行结束,以双字符序列,一个回车符(ascii13)和一个换行符(ascii10)结尾。尾部序列被写作“CRLF”(表示换行)。它对指出http规范以换行(“CRLF”)结尾是有价值的,健壮的应用应该接受这个换行字符。一些比较陈旧的http应用不会发送这个换行字符。
实体,或者消息体是简单的数据块。和开始行和头部行不同。消息体包括文本或者二进制数据,或者可以为空。
在例子3-3中,消息头给你了一些关于主体的信息。content-type行告诉你主体信息,在3-3例子中。他是一个plain-text文本。content-length告诉你这个主体有多大。这里表示有19个字节。
消息语法
所有的http消息分为两种类型:request消息,和response消息。request消息是请求web server的行为。response消息将request请求的结果返回给客户端(client)。request和response消息有相同的消息结构。图-3-4展示了请求一个gif图片的消息。这里是一个规范的request消息
<method> <request-URL> <version>
<headers>
<entity-body>
图3-4
这里是一个规范的response消息(注意:只有在开始行的语法不一样)
<version> <status> <reason-phrase>
<headers>
<entity-body>
这里是对这几部分的快速描述
方法(method):
客户端从服务器请求资源的的行为。他们是一个简单的词,如:“get”,“head”,“post”,我们将详细讨论这些方法的细节,在后续的章节中。
request-url:
一个完整的url名称表示了所要请求的资源。关于url路径的组成部分,如果你想直接和服务器交互,最好的方式就是用绝对路径,去请求服务器如host/port的方式,在第二章有关于url的语法细节。
version:
版本号在http消息中被使用。他的规范如下:
HTTP/<major>.<minor>
这里的major,minor表示整数。我们将在这一章节小幅的讨论http版本。
status-code:
一个三位数,用来描述在request请求中发生了什么。每一个状态吗的第一位表示一种状态(“success”,“error”,等等);
详尽的状态吗在http规范中列出,他们的意思,在这一章将会说明。
reason-phrase(原因):
一个可读数字状态码,包含所有的文本直到换行结束。每一种状态码代表一种原因在http规范中。这些原因为了使人们更好的理解。例如:response 消息中包含“HTTP/1.0 200 NOT OK” and “HTTP/1.0 200 OK”等同与请求成功。否则用其他状态码来表示。
headers:
0或多个headers,每一个名字后面跟着(:)后面加一个空格,然后再跟一个值。再跟一个回车换行。头部行结束用一行空格和回车换行来表示。意味着头部消息结束,主体开始。在http1.1中用一些标题来表示request和response是有效的。
entity-body:
在主体行包括一个任意大小的数据块。并不是所有的消息都包含一个实体。有时,一个消息头只包含一个回车换行。我们将在第15章中讨论实体的细节。
在图3-5中演示了假想的request和response消息
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于