1.HTTP报文格式
  HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
  请求报文:
  一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

  

网址报文大小怎么 nginx http报文的种类_数据

1.1.请求行
  请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
  HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
  GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
  POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

1.2.请求头部
  请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
  User-Agent:产生请求的浏览器类型。
  Accept:客户端可识别的内容类型列表。
  Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
1.3.空行
  最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
  对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
1.4.请求数据
  请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

1.5.
  请求示例
* 使用的表单:

<form name="form1"  action="aaa.html" method="get">
 <input type="text" name="username" /><br>
 <input type="text" name="tel" /><br>
 <input type="submit" value="提交" /><br>
</form>

 

* get
  * 传输的数据量小 不能超过1k
  * form表单的method属性位get传递的形式?传递参数,如果有多个参数用&隔开,参数和值在请求的路径后面,如下第一行所示

GET /test03/aaa.html?username=zhang&tel=110 HTTP/1.1  
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, 
application/
vnd.ms-  powerpoint, application/msword, */*
Referer: http://localhost:808/test03/a.html
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)
Accept-Encoding: gzip, deflate
Host: localhost:808
Connection: Keep-Alive

 

* post
  * 传输的数据量不限制
  * form表单的method属性位post 传递的形式正文部分如下:

POST /test03/aaa.html HTTP/1.1
 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/
 vnd.ms-powerpo
 int, application/msword, */*
 Referer: http://localhost:808/test03/a.html
 Accept-Language: zh-cn
 User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)
 Content-Type: application/x-www-form-urlencoded
 Accept-Encoding: gzip, deflate
 Host: localhost:808
 Content-Length: 22
 Connection: Keep-Alive
 Cache-Control: no-cache

 username=zhang&tel=110

 

  在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 22,此post数据中包含两项 username=zhang,tel=110,其中:Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型

 

2.HTTP响应

  HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

  如下所示,HTTP响应的格式与请求的格式十分类似:

  请求报文由状态信息(status-line)、响应头部(header)、空行和响应数据体4个部分组成

  <status-line>

  <headers>

  <blank line>

  [<response-body>]

  正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

 

  状态行格式如下:

  HTTP-Version Status-Code Reason-Phrase CRLF

  其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  1xx:指示信息--表示请求已接收,继续处理。
  2xx:成功--表示请求已被成功接收、理解、接受。
  3xx:重定向--要完成请求必须进行更进一步的操作。
  4xx:客户端错误--请求有语法错误或请求无法实现。
  5xx:服务器端错误--服务器未能实现合法的请求。

  常见状态代码、状态描述的说明如下。

  200 OK:客户端请求成功。
  400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  403 Forbidden:服务器收到请求,但是拒绝提供服务。
  404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  500 Internal Server Error:服务器发生不可预期的错误。
  503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

  下面给出一个HTTP响应报文例子

网址报文大小怎么 nginx http报文的种类_数据_02

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

网址报文大小怎么 nginx http报文的种类_数据_02

 

3.GET与POST区别
   HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
   HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
   HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。
   与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。

   1.get是从服务器上获取数据,post是向服务器传送数据。
   2.在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
   3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
   4.GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
   5.安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

   注:所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
 
 下面举一个简单的例子来说明它们的区别:
 

<!-分别通过get和post方式提交表单--> 
 <FORM ACTION="getpost.asp" METHOD="get"> 
 <INPUT TYPE="text" NAME="Text" VALUE="; 
 <INPUT TYPE="submit" VALUE="Get方式"></INPUT> 
 </FORM> 
 <BR> 
 <FORM ACTION="getpost.asp" METHOD="post"> 
 <INPUT TYPE="text" NAME="Text" VALUE="; 
 <INPUT TYPE="submit" VALUE="Post方式"></INPUT> 
 </FORM> 
 <BR>
 <% If Request.QueryString("Text") <> "" Then %> 
 通过get方式传递的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR> 
 <% End If %>
 <% If Request.Form("Text") <> "" Then %> 
 通过Post方式传递的字符串是: "<B><%= Request.Form("Text") %></B>"<BR> 
 <% End If %>