HTTP协议的几种请求方法(get/post 差别)17.2.15日更新

from :http://blog.chinaunix.net/uid-21778123-id-1815443.html 

http://www.cnblogs.com/yxnchinahlj/archive/2012/10/23/2735446.html

转的太多也不知道谁是原作了,补了一点东西上去。

http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html from hyddd  17年1月25日看到,以<!--...-->方式做了新的增补。

【问题的引入】

 以前知道HTTP有GET和POST两种请求方法,并且都见过,但印象里两者差不多,可以混着用。最近要进一步研究这个问题,才发现原来的想法不对。

 不对有两点:1,GET和POST区别很大; 2,HTTP有不止这两种请求方法。

get和post这是http协议的两种方法,另外还有head,  delete等 

<!--

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的4个操作。

GET=获取,查询;PUT=更新

Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求

-->

这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是通过另外的流传递的,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。  

在servlet开发中,以doGet()和doPost()分别处理get和post方法。  

另外还有一个doService(),  它是一个调度方法,当一个请求发生时,首先执行doService(),不管是get还是post。在HttpServlet这个基类中实现了一个角度,首先判断是请求时get还是post,如果是get就调用doGet(),  如果是post就调用doPost()。你也可以直接过载doService()方法,这样你可以不管是get还是post。都会执行这个方法。  

---------------------------------------------------------------  
 
1.通过表单提交到的servlet,看form的method是get还是post  
2.通过链接访问的servlet,doGet  
3.直接在ie地址栏中键入的servlet地址,doGet  
 
一般只要实现一个doGet,再另外一个doPost里面调用doGet(resq,resp),resq和resd是doPost的参数.  
---------------------------------------------------------------  




【GET和POST的区别】
 首先要明白,这两者区别很大,数据在传输和处理的过程也不一样,程序设计者必须完全明白其区别,才能设计出合理的web程序。以下内容参考了文章GET和POST的本质区别是什么?

(1)使用范围的区别:

 使用GET时,form中的数据集(如input框的value)将被编码到URL中,作为URL的一部分。而使用POST时,form中的数据集则被编码到http协议的header中,构造成消息发送。在使用上,当且仅当请求是幂等(请求任意次都返回同样的结果)时使用GET,而当请求会改变服务器数据或状态时使用POST。当程序设计人员正确的使用GET,POST时,浏览器会给出更好的缓存配合,使响应速度更快。

<!--原理上,1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

  (1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

  * 注意:这里安全的含义仅仅是指是非修改信息。

  (2).幂等的意味着对同一URL的多个请求应该返回同样的结果。
2. 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。-->

(2)在form提交阶段的差别:

form提交的第一步是创建数据集,并根据 ENCTYPE 指定的类型值对数据集进行编码。 ENCTYPE 有两个值:multipart/form-data,application/x-www-form-urlencoded(默认值)。form提交的第二步是进行数据传输。对于GET方法,数据集使用application/x-www-form-urlencoded编码;而对于POST方法,数据集的 ENCTYPE 可以指定。

application/x-www-form-urlencoded对form数据集的编码规则:(1)如果是字母或数字,则直接使用其ascii码的十六进制。(2)对于非字母也非数字的字符,则不仅使用其ascii码的十六进制,还要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的urlencoded编码就是%5c。相应的解码函数(转载)如下:

/**
* 用C语言实现URL解密
* QQ:339534039
* 日期:2006.11.29
*/

void urldecode(char*p)
{
register i=0;
while(*(p+i))
{
   if ((*p=*(p+i))=='%')
   {
    *p=*(p+i+1)>='A' ? ((*(p+i+1)& 0XDF) - 'A')+ 10: (*(p+i+1)-'0');
    *p=(*p)* 16;
    *p+=*(p+i+2)>='A' ? ((*(p+i+2)& 0XDF) - 'A')+ 10:(*(p+i+2)-'0');
    i+=2;
   }
   else if (*(p+i)=='+')
   {
    *p=' ';
   }
   p++;
}
*p='\0';
}


(3)服务器端处理差别:

       原则上,处理GET和POST请求是没有分别的。但由于数据通过不同的方法编码,需要有不同的解码机制。所以,方法变化将导致处理请求的代码变化。比如对于cgi,处理GET时通过环境变量获得参数,处理POST请求时则通过标准输入(stdin) 获得数据。使用GET,form中的数据将编码到url中,而使用POST的form中的数据则在http协议的header中传输。在使用上,当且仅当请求幂等(字面意思是请求任意次返回同样的结果,本质是请求本身不会改变服务器数据和状态)时使用GET,当请求会改变服务器数据或状态时(更新数据,上传文件),应该使用POST。

(4)实际使用经验的总结:

       1、get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

       2、对于get方式,服务器端.asp用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。<!--在JSP中,用request.getParameter(\"XXXX\")来获取。在PHP中,可以用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获取GET和POST两种请求中的数据。-->

       3、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

<!--GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。  注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。

理论上讲,POST是没有大小限制的HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。

  对于ASP程序,Request对象处理每个表单域时存在100K的数据长度限制。但如果使用Request.BinaryRead则没有这个限制。

  由这个延伸出去,对于IIS 6.0,微软出于安全考虑,加大了限制。我们还需要注意:

     1).IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。
     2).IIS 6.0默认上传文件的最大大小是4MB。
     3).IIS 6.0默认最大请求头是16KB。
  IIS 6.0之前没有这些限制。[见参考资料5]

-->

       4、get安全性非常低,post安全性较高。

<!--这里的“安全”不仅是指不作数据修改,而是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击(关于csrf,跨站请求伪造,JSON顶层数组,可以参见hyddd的另一篇文章)。-->

       5、<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">是一样的,也就是说,action页面后边带的参数列表会被忽视;而<form method="post" action="a.asp?b=b">跟<form method="post" action="a.asp">是不一样的。

另外

Get请求有如下特性:它会将数据添加到URL中,通过这种方式传递到服务器,通常利用一个问号?代表URL地址的结尾与数据参数的开端,后面的参数每一个数据参数以“名称=值”的形式出现,参数与参数之间利用一个连接符&来区分。
Post请求有如下特性:数据是放在HTTP主体中的,其组织方式不只一种,有&连接方式,也有分割符方式,可隐藏参数,传递大批数据,比较方便。



【HTTP的各种请求方法】

       以下内容引自:http://blog.chinaunix.net/u2/82392/showart_1724853.html 

       打不开啊。。。。


     客户程序向服务器发送的请求可以有不同的类型,这样服务器可以根据不同的请求类型进行不同的处理。在HTTP1.0中,定义了三种最基本的请求类 型,GET、POST和HEAD,这些请求方法的实现方式均与上例相同,客户程序用大写指令将请求发送给服务器,后面跟随具体的数据。

       其中,HEAD请求在客户程序和服务器之间进行交流,而不会返回具体的文档。当使用GET和POST方法时,服务器最后都将结果文档返回给客户程序,浏览器将 刷新显示。而HEAD请求则不同,它仅仅交流一些内部数据,这些数据不会影响浏览的过程。因此HEAD方法通常不单独使用,而是和其他的请求方法一起起到 辅助作用。一些搜寻引擎使用的自动搜索机器人使用这个方法来获得网页的标志信息,或者进行安全认证时,使用这个方法来传递认证信息。

       除了这三种最常见的访问方法之外,在HTTP1.1中还定义了更多的访问方法类型,如PUT,用于将网页放置到正确位置,DELETE用于删除相关文档 等。这些方法并不常用,因而大部分Web服务器软件并没有实现他们。然而对于特定场合他们还是非常有用的,例如使用软件编辑网页时,网页编辑器可以使用这 些方法,管理不同的网页。
       如果服务器不支持客户发送的请求方法,服务器将返回错误并立即关闭连接。

<--文章完-->

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值