`

从HTTP GET和POST的区别说起

阅读更多

面试时得到的回答大多是:POST是安全的,因为被提交的数据看不到,或者被加密的,其它的还有GET的时候中文出现乱码(在地址栏里),数据最大长度限制等等。

说 POST 比 GET 安全肯定是错的,POST跟GET都是明文传输,用httpfox等插件,或者像WireShark 等类似工具就能观察到。

POST和GET的差别其实是很大的。语义上,GET是获取指定URL上的资源,是读操作,重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来(其中还有很多细节,但不影响这里的讨论)。

而POST的语意是对指定资源“追加/添加”数据,所以是不安全的,每次提交的POST,参与的代码都会认为这个操作会修改操作对象资源的状态,于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。

很遗憾到目前为止没有应聘者能够提到这一点。我猜测这背后的原因大概有两个,一是也许大多数人往往(我也一样)满足于只要完成任务就好,不管用哪个,表单提交了,数据处理了,内容显示或者重新定向到另外一个页面,就算完成了一个任务,从任务表里划掉,结束。而且对大部分项目(OA, CRM, MIS)的大部分情况下,用哪个似乎都可以。

同时,在被商业机构在媒体和书籍上宣传兜售的WS-*概念和使用集成开发环境提供的“方便”的代码生成工具后,“了解”到所有Web服务调用都是通过POST,更潜意识里确定了POST和GET是一样的,而且GET能做的,POST都能做,POST简直就是GET++嘛。自然,能用POST就用POST,不必在乎两者的差别了。

这又让我想起最近学到的一个概念: Radius Of Comprehension,理解的半径:

当学习概念A的时候,需要先了解概念B,而概念C又是理解B的前提。当B和C都是新的需要学习的概念时,可以说A的理解半径是2,如图:

A --> B --> C
|--1--|--2--|

在学习Web开发时,接触到GET和POST时,“理解的半径”可能包涵:

POST vs. GET
     |---> Conditional GET -> ETag -> Cache
     |         `--> Status Code
     `---> HTTP的方法 --> URL

往往因为仅仅满足于完成手上被要求的任务,或者懒于问一个为什么,我们就把自己的理解半径设置成零,那么就学不到更深入的东西,也因此仅仅知道POST和GET不同,而不再会了解不同在哪里,什么是Conditional GET和缓存header等概念。

从一个简单的面试问题谈到这,貌似小题大作了,写到哪算哪吧。

<UPDATE>
看到Fenng Buzz 了这篇文字,引起一些评论,因此在这再讨论两个概念: 安全的(Safe)和幂等的(Idempotent)

安全的是指没有明显的对用户有影响的副作用(包括修改该资源的状态)。HTTP方法里的GET和HEAD都是安全的。

幂等的是指一个方法不论多少次操作,结果都是一样。PUT(把内容放到指定URL),DELETE(删除某个URL代表的资源),虽然都修改了资源内容,但多次操作,结果是相同的,因此和HEAD,GET一样都是幂等的。

所以根据HTTP协议,GET是安全的,也是幂等的,而POST既不是安全的,也不是幂等的。
</UPDATE>

分享到:
评论
1 楼 hsbcnet 2010-10-02  
记得以前写过一个网站,能下载PDF文件的。用户在浏览器窗口打开,再刷新,好像就有问题。这里牵涉到get和post的问题。忘了用哪种方式就没问题。

相关推荐

    Ajax中get和post区别

    其中,Get和Post是两种常用的HTTP请求方法,尽管它们都是用于将数据从客户端发送到服务器端,但是它们之间存在着很多的区别。 Get请求 Get请求是一种最常用的HTTP请求方法,用于从服务器端检索数据。Get请求的特点...

    Http协议中POST和GET方法的本质区别

    HTTP中的POST和GET方法是两种最常用于网页开发的数据传输方式,它们在原理和表现形式上存在本质区别。 首先,从原理上看,GET方法通常用于获取资源信息,它通过URL来传递参数,URL全称为资源描述符,表示网络上的一...

    浅析Get与Post的区别

    本文将详细阐述Get和Post的区别,以便读者更好地理解和使用这两种方式。 Get方式 Get方式是一种常用的表单提交方式,它将数据附加到URL后面,以“?”号分隔,然后将数据发送到服务器端。Get方式的主要特点是: 1...

    ajax POST 与GET提交的区别

    接下来,我们将从多个方面详细分析GET和POST之间的区别: 1. **数据传输位置**: - **GET**: 参数被附加在URL之后,通过URL传输数据。 - **POST**: 数据放在HTTP消息体中传输。 2. **数据长度限制**: - **GET**:...

    get、post区别

    理解GET与POST的区别对于掌握Web开发至关重要。 ### GET与POST的基本区别 #### 1. 数据传输位置 - **GET**:参数通过URL进行传递,数据附在URL之后,以问号“?”分隔URL和传输数据,并且多个参数之间用“&”符号...

    get和post的区别

    ### GET与POST方法的区别 在Web开发中,GET与POST是最常见的两种HTTP请求方式,它们在功能、安全性、数据传输等方面存在显著差异。本文将基于提供的文件内容对这两种方法进行详细解析。 #### 1. 基本概念 - **GET...

    GET与POST的区别

    GET和POST是HTTP协议中两种最常用的请求方法,它们都是用来从客户端向服务器端发送请求的,但它们之间有很多不同之处。 GET方法 GET方法是从服务器上获取数据的请求方法。它的主要特点是将参数数据队列加到提交...

    表单提交中get和post的区别

    从这个定义中我们可以看出,get和post的主要区别在于数据的传输方向。 在get方式中,参数数据队列会被加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。例如,假设我们有一个...

    C#实现HTTP GET和POST 样例代码

    本文将深入探讨如何使用C#编程语言来实现HTTP GET和POST请求,以供学习者参考。 GET和POST是HTTP协议中最常见的两种请求方法。GET用于获取资源,而POST则常用于提交数据。 **HTTP GET方法** GET请求通常用于获取...

    http协议get与post的区别

    在深入探讨HTTP协议中GET与POST请求方法的区别之前,我们首先需要理解HTTP(HyperText Transfer Protocol)的基础概念。HTTP是一种应用层协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。它允许数据在...

    对Django 中request.get和request.post的区别详解

    Django 中request.get和request.post的区别 POST和GET差异: POST和GET是HTTP协议定义的与服务器交互的方法。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。另外,还有PUT和DELETE方法。 POST和GET都...

    httppost和httpget需要的jar包

    1. `httpclient.jar`:这是HttpClient的主要库,提供了HTTP请求和响应处理的类和接口,包括`HttpClient`、`HttpGet`和`HttpPost`等。 2. `httpcore.jar`:这是HttpClient的核心库,包含了网络通信的基本组件,如...

    get、post、request的区别

    在PHP编程中,了解HTTP请求方法,特别是GET、POST和REQUEST的作用至关重要,因为它们涉及到如何接收和处理客户端发送的数据。让我们深入探讨这三个变量的区别以及如何在实际应用中使用它们。 首先,`$_GET`变量用于...

    PHP GET 和 POST 的区别

    当我们谈论PHP中的GET和POST方法时,这是HTTP协议中两种主要的数据提交方式,它们各自有着不同的特性和用途。 **1. GET方法** GET是HTTP请求中最基本的方式,用于向服务器请求资源。当用户在浏览器地址栏输入URL或...

    POST和GET的区别

    网络编程中用到的交互方式post和get的区别

    GET请求和POST请求的区别(详细)

    ### GET请求和POST请求的区别详解 #### 一、概述 HTTP协议定义了多种与服务器进行交互的方法,其中最基本的包括GET、POST、PUT和DELETE。这些方法分别对应于对网络资源的查询、更新、创建和删除操作。GET通常用于...

    C# http Get/POST请求封装类

    GET和POST是HTTP协议中最常见的两种请求方法,分别用于获取资源和提交数据。本文将详细讨论如何在C#中封装一个用于执行HTTP GET和POST请求的类,以及`HttpHelper.cs`文件中的关键实现。 首先,了解GET和POST的基本...

    PHP 中的get与 post 方法的区别!

    PHP 中的get与 post 方法的区别

    VC++ HTTP Get Post请求

    在VC++编程环境中,HTTP(超文本传输协议)Get和Post请求是常见的网络通信方法,主要用于从或向Web服务器发送数据。MFC(Microsoft Foundation Classes)库为VC++提供了便捷的方式来实现这些功能。本文将详细讲解...

Global site tag (gtag.js) - Google Analytics