不一样,我们分别来介绍哦
下面看一个typical的HTTP请求报文的例子
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
1.HTTP请求报文是ASCII text
2.每一行都有一个carriage return and a line feed,最后一行再附加一个carriage return and line feed
3.第一行叫请求行
,请求行有3个字段:方法字段, URL字段, HTTP版本字段
方法字段可以有很多值:GET, POST, HEAD, PUT, and DELETE
URL字段是请求对象在服务器上的路径
HTTP版本字段:是自我解释的,解释我这个浏览器实现的是HTTP的哪个版本。
4.紧接着请求行的叫做头行
(header lines)
Host: www.someschool.edu证明了请求对象所在的主机,Web代理缓冲需要Host头
Connection: close, 这个浏览器高速服务器它不屑于使用持久性连接,它希望服务器在发送这个对象之后就关闭掉TCP连接
User-agent: 指明了浏览器的类型,这个头很有用,因为服务器可以将相同对象的不同版本发送给不同类型的浏览器。每个版本都是由相同的URL寻址。
Accept-language: fr, 如果在服务器上有这个对象的法语版本的话,这个头表明了用户偏好这个对象的法语版本。如果服务器上没有这个对象的法语版本,服务器将发送这个对象的默认版本。
下面是HTTP报文的通用格式,一定要记住了!
对,跟我们上面讲解的例子相比,多了个entity body(实体主体)。
因为对GET方法来讲,实体主体为空。但是实体主体在POST方法中要用到。
什么时候使用POST方法呢?
通常是用户在HTTP客户单填写表单的时候,例如当一个用户给一个搜索引擎提供搜索关键字的时候。用户提供的关键字就被包含在实体主体中。
但是并不是表单一定要用POST方法,HTML表单也经常使用GET方法,并将表单中输入的数据包含在URL中。
例如这种:
www.somesite.com/animalsearch?monkeys&bananas.
下面参考了wiki post
通过设计,POST请求方法要求web服务器能够接受封装在请求报文entitybody中的数据。该方法经常用于上传文件和提交一个表单时。
相比之下,HTTP GET方法是从服务器中获取信息。作为GET请求的一部分,某些数据可以通过URL的query string来传递,指定某些搜索项,数据的范围或者是其他可以定义query的信息。
作为POST请求的一部分,任意类型,任意大小的数据都可以在请求报文的entitybody中被发送到服务器。POST请求中的某个头行经常表明了报文题中的网络媒体类型。
例如,当POST方法用于提交Web表单时,当一个Web浏览器向Web表单发送一个POST请求之后,默认的网络媒体类型是"application/x-www-form-urlencoded". 这是一种专门用于编码key-value pairs的格式(key可以重复)。每一个key-value pair是由&分开的。And each key is separated from its value by an “=” character. Keys and values are both escaped by replacing with the ‘+’ character and then using percent-encoding on all other non-alphanumeric characters.
例如,下面这个key-value pairs
Name: Gareth Wylie
Age: 24
Formula: a + b == 13%!
就会编码成下面这个样子
Name=Gareth+Wylie&Age=24&Formula=a+%2B+b+%3D%3D+13%25%21
HEAD方法和GET方法有点类似。当一个服务器收到一个带有HEAD方法的请求时,服务器会用一个HTTP报文响应,但是并不返回请求的对象。应用开发者经常使用HEAD方法来debug,好吧,我服了
PUT方法经常与Web发行工具联合使用,它允许用户上传对象到指定的Web服务器上指定的路径。PUT方法也被那些需要向Web服务器上传对象的应用程序使用。
DELETE方法允许用户或者应用程序删除Web服务器上的对象
下面我们提供一条typical的HTTP响应报文,该响应报文可以是对刚刚讨论的例子中的请求报文的回应。
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data ...)
响应报文包含3个区域
状态行包含3个字段
Connection: close, 服务器告诉客户端服务器在发送完这个报文之后就要关闭TCP连接了。
Date: 表明了HTTP响应创建和发送的时间,注意!这不是对象创建的时间,而是服务器从服务器的文件系统中获取对象,将对象插入到相应报文的,发送相应报文的时间。
Server: Apache/2.2.3 (CentOS)表明了这条报文是由Apache Web Server产生的。它有点儿类似于HTTP请求报文中的User-agent.
Last-Modified: 表明的是对象创建或者上次修改的时间和日期,这个头对对象缓存来说很关键。
Content-Type: text/html 表明在实体主题中的对象是HTML text。这个对象的类型通常是由Content-Type头表明,而不是由文件的后缀名决定。
下面是通用的HTTP响应报文的格式:
基本和我们上面的例子是一致的,我们就状态码多说两句。
HTTP使用了cookies,允许网站keep track of users. 许多重大的商业Web站点今天都使用了cookies.
cookie技术有4个部分:
(1)在HTTP响应报文中的cookie头行
(2)在HTTP请求报文中的cookie头行
(3)一个cookie文件,保存在用户的端系统中,由用户的浏览器管理
(4)Web站点的一个后端数据库
我们看下这个图就明白了。
报文的核心部分,它包含了请求的对象本身, represented by (data data data …)