`
天府小茶客
  • 浏览: 12828 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

http中GET与POST的表面和本质区别

阅读更多

先给出w3c的对比:

 

GET

POST

后退按钮/刷新

无害

数据会被重新提交(浏览器应该告知用户数据会被重新提交)。

书签

可收藏为书签

不可收藏为书签

缓存

能被缓存

不能缓存

编码类型

application/x-www-form-urlencoded

application/x-www-form-urlencoded multipart/form-data。为二进制数据使用多重编码。

历史

参数保留在浏览器历史中。

参数不会保存在浏览器历史中。

对数据长度的限制

是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

理论上无限制。

对数据类型的限制

只允许 ASCII 字符。

没有限制。也允许二进制数据。

安全性

POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。

在发送密码或其他敏感信息时绝不要使用 GET

POST GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。

可见性

数据在 URL 中对所有人都是可见的。

数据不会显示在 URL 中。

 

以上只是表面上的区别,但是深层次的根本原因是什么?在网上搜索一番后,觉得以下说法比较有道理,可以参考:

 

RFC7231里定义了HTTP方法的几个特性:

 

Safe - 安全

这里的「安全」和通常理解的「安全」意义不同,如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。客户端向服务端的资源发起的请求如果使用了是安全的方法,就不应该引起服务端任何的状态变化,因此也是无害的。 RFC定义,GET, HEAD, OPTIONS TRACE 这几个方法是安全的。

但是这个定义只是规范,并不能保证方法的实现也是安全的,服务端的实现可能会不符合方法语义,正如上文说过的使用GET修改用户信息的情况。

引入安全这个概念的目的是为了方便网络爬虫和缓存,以免调用或者缓存某些不安全方法时引起某些意外的后果。User Agent(浏览器)应该在执行安全和不安全方法时做出区分对待,并给用户以提示。

 

Idempotent - 幂等

幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。按照RFC规范,PUTDELETE和安全方法都是幂等的。同样,这也仅仅是规范,服务端实现是否幂等是无法确保的。

引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。

 

Cacheable - 可缓存性

顾名思义就是一个方法是否可以被缓存,此RFCGETHEAD和某些情况下的POST都是可缓存的,但是绝大多数的浏览器的实现里仅仅支持GETHEAD。关于缓存的更多内容可以去看RFC7234

在这三个特性里一直在强调同一个事情,那就是协议不等于实现:协议规定安全在实现里不一定安全,协议规定幂等在实现里不一定幂等,协议规定可缓存在实现里不一定可缓存。这其实就是上面那个作者提到的specificationimplementation的关系。

 

语义之争

走到这一步,其实就明白了要理解这两个方法的区别,本质上是「语义」的对比而不是「语法」的对比,是「Specification」的对比而不是「Implementation」的对比

 

关于这两种方法的语义,RFC7231里原文已经写得很好了:

The GET method requests transfer of a current selected representation for the target resource. GET is the primary mechanism of information retrieval and the focus of almost all performance optimizations. Hence, when people speak of retrieving some identifiable information via HTTP, they are generally referring to making a GET request.

A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.

The POST method requests that the target resource process the representation enclosed in the request according to the resource’s own specific semantics.

 

翻译一下:

1GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-Control Header的约束),GET方法的报文主体没有任何语义。

 

2POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。为了针对其不可缓存性,有一系列的方法来进行优化。

 

 

举一个通俗栗子,在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。

分享到:
评论

相关推荐

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

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

    Ajax中get和post区别

    "Ajax中Get和Post请求的区别" Ajax作为异步JavaScript和XML的简写,是一种创建交互式网页的技术。其中,Get和Post是两种常用的HTTP请求方法,尽管它们都是用于将数据从客户端发送到服务器端,但是它们之间存在着很...

    表单提交中get和post的区别

    表单提交中get和post的区别 在Web开发中,表单提交是非常常见的一种交互方式,而在表单提交中,get和post是两种常用的提交方式。它们之间的区别是每个Web开发者都需要了解的。 首先,让我们来了解一下get和post的...

    http协议get与post的区别

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

    浅析Get与Post的区别

    浅析Get与Post的区别 Get和Post是两种常用的表单提交方式,在Web开发中经常被使用。但是,很多人并不了解这两种方式的区别,导致在实际开发中出现问题。本文将详细阐述Get和Post的区别,以便读者更好地理解和使用这...

    GET与POST的区别

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

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

    PHP 中的get与 post 方法的区别

    基于Labview的HTTP的GET与POST请求示例

    超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的...在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据

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

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

    ajax POST 与GET提交的区别

    在探讨AJAX中GET和POST的区别之前,我们先来了解一下这两种请求方式的基本概念。 **GET**请求通常用于获取资源信息,它将参数拼接到URL后面,并通过URL传输数据。这种方式适合于那些不会更改服务器状态的操作,例如...

    深入理解get与post方法的差别

    深入理解GET与POST方法的差别:HTTP协议解析 在探讨GET与POST方法的差别之前,我们首先需要了解HTTP协议的基本概念。HTTP(HyperText Transfer Protocol)超文本传输协议,是互联网上应用最为广泛的一种网络协议,...

    httppost和httpget需要的jar包

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

    Ajax中get与post请求详解

    Ajax 技术中 get 与 post 两种请求方式是许多开发者经常遇到的疑问,以下将详细解释两者的区别,并提供实例代码。 一、get 与 post 的基本区别 1. 参数传递方式:get 请求将参数数据队列加到提交表单的 ACTION ...

    get、post区别

    GET与POST方法是Web开发中最基础且重要的概念之一,它们都是HTTP请求的两种方式,用于客户端(如浏览器)向服务器发送请求。理解GET与POST的区别对于掌握Web开发至关重要。 ### GET与POST的基本区别 #### 1. 数据...

    get与post实例

    本文将深入探讨GET和POST的区别、应用场景以及VB(Visual Basic)中如何使用它们。 GET和POST是HTTP请求的核心方法,用于从服务器获取数据或向服务器发送数据。GET主要用于从服务器获取资源,它的参数通常显示在URL...

    get和post的区别

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

    get、post、request的区别

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

    DelphiXE10.3封装http-get-post成dll及调用

    ` 和 `function HttpPost(const URL, Data: string): string; stdcall;`。 - 在DLL项目的实现部分,实现这两个函数,使用`IdHTTP`组件进行GET和POST操作。 3. 导出函数: - 在`unit`的`interface`部分,使用`...

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

    GET和POST是HTTP协议中最常见的两种请求方法。GET用于获取资源,而POST则常用于提交数据。 **HTTP GET方法** GET请求通常用于获取服务器上的特定资源。在C#中,我们可以使用`HttpClient`类来发送GET请求。以下是一...

Global site tag (gtag.js) - Google Analytics