get,post,put,delete含义与区别

原文链接:http://286.iteye.com/blog/1420713

  1. POST   /uri     创建  
  2. DELETE /uri/xxx 删除   
  3. PUT    /uri/xxx 更新或创建  
  4. GET    /uri/xxx 查看  


        GET操作是安全的。所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如我用GET浏览文章,不管浏览多少次,那篇文章还在那,没有变化。当然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端逻辑造成的。
        PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。
        POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
        安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
        还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
  
        关于GET POST 的混淆
        先说相同点,只有了解了相同点之后才能理解为什么会发生混淆。
        两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是

Java代码    收藏代码
  1. param1=value1&param2=value2&....  

        get 和 post 区别如字面,一个是get(获取),一个是post(发送)。

        get用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以提供查询参数(query)以获得相应内容。

        post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理之后再存储)。

        get和post出现混淆是因为对提交的数据处理方法的滥用造成的,数据是无辜的。

        混淆之一:
        将get提交的用来查询的字段当作是存储数据存入了服务器端文件或者数据库。然后就误以为get是用来提交用于存储的数据的。

        混淆之二:
        编写脚本在服务器端通过处理post提交的数据并返回内容。只要有数据,就能用来进行判断,脚本怎写是程序员的事,而不在乎数据来源的形式(post、get,或者是自己预设值的常量)。这点功能上确实没问题,只是背离的其初始目的而已。

        由于都是要传送数据,且数据格式相同(即使数据格式不同,只要能提取出相应数据)。使用的时候难免出现张冠李戴,将get数据用来存储、将post数据用来检索返回数据。但是二者还是有区别的(主要是根据其用途而“人为”造成的),get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,所以还是老老实实用来做检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),因此对于大的数据(一般来说需要存储的数据可能会比较大,比2048字节大)的传递有天然的优势,谁让它是 nature born post 呢。

        get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,可以在地址栏随时修改数据以变更需要获取的内容,比如直接修改分页的编号就跳到另外一个分页了(当然也可能是 404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多,url的修改只要点击地址栏输入字符就可以了),除非是专门跑来编辑数据的。

        PS:post和get的安全性在传输的层面上区别不大,但是采用url提交数据的get方式容易被人肉眼看到,或者出现在历史纪录里,还是可能被肉眼看到,都是一些本地的问题。

        注1:我强调的是内容,至于http协议中的get和post的格式大家有兴趣就自己看看吧。
        注2:get方式主要是为了获得预期内容,即uri+query相同时所得到的内容应该是相同的。而post主要是提交内容,至于是否有必要返回页面可能只是出于用户体验,比如注册时返回你的注册id,但是如果只是返回一个“您已注册成功”的相同页面(即使你post的数据不一样)也没什么好奇怪的。
        注3:关于这个“人为”,不是那么贴切,get和post还是有技术层面的区别的。但是从表象上看暂且这么说吧,毕竟二者的混淆也是“人为”的。

 

        HTTP POST GET 本质区别 
        原理区别

        一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE URL 全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。   
        根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。   
        1.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。   
* 注意:这里安全的含义仅仅是指是非修改信息。   
        2.幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等 这个概念:   
幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。   
        幂等有以下几种定义:对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。   
        对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x 。 看完上述解释后,应该可以理解GET幂等的含义了。   
        但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。 
        根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。   
        上面大概说了一下HTTP规范中,GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:           
        1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。  
        2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。   
        3.另外一个是,早期的但是Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计 。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。


### 回答1: GET、POST、PUT、DELETE 是四种不同的 HTTP 方法。 - GET 请求用于获取服务器上的资源。GET 请求是幂等的,意味着多次发送相同的 GET 请求不会对服务器上的资源造成影响。 - POST 请求用于向服务器提交数据。POST 请求不是幂等的,意味着多次发送相同的 POST 请求可能会对服务器上的资源造成影响。 - PUT 请求用于更新服务器上的资源。PUT 请求也是幂等的。 - DELETE 请求用于删除服务器上的资源。DELETE 请求也是幂等的。 ### 回答2: 在Web应用程序开发中,HTTP协议是非常重要的一种协议。它定义了客户端和服务器之间的通信规则,让Web应用程序能够通过HTTP标准接收和发送数据,支持通用的Web服务。 HTTP协议提供了一些基本操作,即get、post、put和delete,这些操作在Web API中有着不同的作用。这些方法定义了客户端可以向服务器发送的不同类型的请求,以及服务器应该如何响应这些请求。 1. GET方法 GET方法是HTTP协议中最常见的方法,也是最基本的获取信息的方法。该方法请求指定的资源,并返回它。客户端向服务器发送一个GET请求,服务器将返回请求的资源。GET方法通常用于获取某个资源的信息。 GET请求只是获取资源,不会修改它。因此,它是一种“安全”方法,不会对存储在服务器上的资源进行任何修改。GET方法通常用于在浏览器中获取网页内容、获取API数据等。 2. POST方法 POST方法是HTTP协议中第二个常见的方法,它通常用于向服务器提交数据。该方法在请求主体中包含数据,服务器接收到该请求后,会处理请求,根据该请求来不同的响应。 POST方法与GET方法不同,它会修改存储在服务器上的资源。因此,它是一种“非安全”方法,可能会引起潜在的问题,例如重复提交表单、错误的数据库更新等。 3. PUT方法 PUT方法是HTTP协议中的一种方法,它允许客户端向服务器提交新资源、更新现有资源或替换现有资源。PUT方法是一种更加强制的请求方法,不仅包含请求主体数据,还包含与资源相关的信息。 PUT方法主要用于更新数据,其典型用例包括更新客户端与服务器之间的数据、更新数据库记录等。PUT方法是一种“幂等”方法,即每个请求的结果都是相同的,不管请求的次数。 4. DELETE方法 DELETE方法是HTTP协议中的一种方法,它用于删除存储在服务器上的资源。与PUT方法一样,DELETE方法也是一种更加强制的请求方法,包含与资源相关的信息。DELETE方法是非安全的,因为它会删除存储在服务器上的资源。 常见的用例包括从数据库中删除记录、删除服务器上的文件等。DELETE方法是一种“幂等”方法,即每个请求的结果都是相同的,不管请求的次数。 总之,GET方法主要用于获取信息,POST方法主要用于向服务器提交数据,PUT方法主要用于更新数据,DELETE方法主要用于删除数据。在开发Web API时,根据具体需求选择正确的HTTP方法,可以提供更好的用户体验和服务。 ### 回答3: get、post、put、delete是常见的HTTP动词,用来表示HTTP请求的不同方式以及对服务器上的资源进行不同的操作。它们之间的区别主要在以下几个方面: 1. 请求方式:GET和POST是最常用的两种HTTP请求方式。GET用于请求资源,而POST用于提交数据。PUT和DELETE则用于对服务器上的资源进行修改或删除操作。 2. 请求参数:GET请求参数会附加在URL的后面,而POST请求参数则包含在请求体中。PUT和DELETE请求也可以携带参数,但是它们通常会有一个指定的资源URL。 3. 安全性:GET请求对服务器上的资源只是进行读取操作,比较安全。而POST、PUT、DELETE操作可能会对服务器上的资源进行修改或删除,需要用户进行一定的授权或身份验证。 4. 幂等性:幂等性是指对资源进行相同的操作时,结果应该是相同的。GET和DELETE请求都是幂等的,即对同一个资源多次请求结果不会发生改变。而POST和PUT请求则不一定是幂等的,因为多次请求可能会导致资源状态不一样。 总结而言,GET用于获取资源,POST用于提交数据,PUT用于修改资源,DELETE用于删除资源。每种请求方式都有其适用场景,我们在进行Web开发时需要结合需求和实际情况来选择合适的请求方式。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值