本文主要对GET与POST基本区别进行汇总并掌握,如有错误与遗漏之处,请指出。

文章出处:http://www.cnblogs.com/useryangtao/

1. HTTP

HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。

HTTP 的工作方式是客户端与服务器之间的 "请求-响应" 协议。

客户端可以是 Web 浏览器,服务器端可以是计算机上的某些网络应用程序。

通常情况下,由浏览器向服务器发起 HTTP 请求,服务器向浏览器返回响应。

响应包含了请求的状态信息以及可能被请求的内容。

2. 请求方式

HTTP方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 。

其中两种常见的 HTTP 请求就是: GET和 POST 。

GET是从服务器上获取数据,POST则是向指定的资源提交要被处理的数据

3. 格式

请求报文的格式:

<request line>

<headers>

<blank line>

<request-body>

GET请求数据按照查询字符串(名称/值对)方式,放置在 HTTP请求协议头(headers) 中,也就是URL之后;

POST提交的数据则放在 实体的主体(request-body) 中。

4. 缓存,书签,历史记录,默认method

缓存 : GET会被缓存,POST不能。

书签 : GET可收藏为书签,POST不可收藏为书签

历史记录 : GET请求的URL,参数会被浏览器保留在历史中,POST参数不会。

默认method : 在from提交的时候,如果不指定Method,则默认为GET请求。

5. 响应速度
GET请求是可以被客户端缓存的。会比POST高效。

AJAX环境中GET响应快速,POST需要先发送HTTP头部(headers) 再发送报文 实体的主体(request-body)中的数据。

6. 类型限制

6.1 GET限制数据集的值必须为ASCII字符; GET提交的数据将会附加在url之后,以?分开与url分开。

1.以 ? 来分隔URL和数据;

2.以& 来分隔参数;

3.如果数据是英文或数字,原样发送;

4.如果数据是中文或其它字符,则进行BASE64编码;

5.GET将数据的按照variable=value的形式,添加到URL后面;

如:http://www.abc.com/?username=yt&id=123

6.2 POST没有限制,允许二进制数据。

POST是将数据放在请求的数据体(request-body)中,有 4 种提交数据的方式(设置content-type):

1.application/x-www-form-urlencoded

提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码
Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」

2.multipart/form-data

表单上传文件时,必须让 form 的 enctyped 等于这个值

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

3.application/json

告诉服务端消息主体是序列化后的 JSON 字符串

POST http://www.example.com HTTP/1.1

Content-Type: application/json;charset=utf-8

{"id":1,"sub":["a","b","c"]}

4.text/xml

它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。

JavaScript 中,也有现成的库支持以这种方式进行数据交互

XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

7. 大小限制

7.1.GET方式提交的数据最多只能是1024字节,POST支持较大数据传输

7.2HTTP协议对GET和POST都没有对长度的限制 RFC 2616 中明确对 uri 的长度并没有限制。

不过虽然在RFC中并没有对uri的长度进行限制,但是各大浏览器厂家实现上限制了URL的长度。

IE对URL长度的限制是 2083字节 (2K+35)

而对于URL长度上的限制,有两方面的原因造成 ( 安全考虑 ): 浏览器:据说早期的浏览器会对URL长度做限制。

IE对URL长度会限制在2083个字符内,Chrome会崩溃。 服务器:URL长了,对服务器处理也是一种负担。

原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL, 并不停地访问你的服务器。

服务器的最大并发数显然会下降。 另一种攻击方式是:把告诉服务器Content-Length是一个很大的数,

然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。

哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。

有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。

但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。

8. 实际中 — POST比GET「相对安全」

GET所发送的数据是 URL 的一部分, 有时候会直接反应在浏览器的地址栏,

现在的浏览器大多会记住曾经输入过的URL(在发送密码或敏感信息时绝不要使用 GET !)。

试想如果你曾经在别人电脑上填过一个很私密的表单,那么你的这份记录很可能被连没什么电脑常识的人都一览无遗。

但是被抓包之后的POST请求和GET请求是一样裸露的,所以这里是相对的。

9. 语义上 — GET比POST「相对安全」

说 POST 比 GET 安全 也不完全对的。 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

在语义上(restful视角): GET的是获取指定URL上的资源,是读操作。

重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,

在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。

因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来。

POST的语义是修改变服务器上的资源的请求,所以是不安全的, 每次提交的POST,代码都会认为这个操作会修改资源的状态,

于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。

作者:
杨涛

出处:
http://www.cnblogs.com/useryangtao

此博客文章仅供交流学习,如原创文章,转载请注明出处。

GET,POST — 简述的更多相关文章

  1. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  2. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

  5. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  6. 简述ASP.NET MVC原理

    1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...

  7. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  8. 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...

  9. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  10. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

随机推荐

  1. BZOJ 1060: [ZJOI2007]时态同步

    Description 一个有根树,你只能进行增加操作,问你将所有叶节点到根的路径权值相同至少需要增加几次. Sol 我也不知道该叫什么算法... 反正就是记录一下到子节点到当前节点的最大距离统计答案 ...

  2. XHPROF相关内容

    定义入口文件 define('XHPROF_OPEN', 0); define('XHPROF_ROOT', '/home/www/xhprof/'); // 开启调试模式 建议开发阶段开启 部署阶段 ...

  3. SQL Server 日期和时间函数

    http://www.cnblogs.com/adandelion/archive/2006/11/08/554312.html 1.常用日期方法(下面的GetDate() = '2006-11-08 ...

  4. linuxqq

    centos7下安装linuxqq出现一大堆依赖包都没有,腾讯搞的这个产品真不给力.寒心. >>>以下来自百度知道:http://zhidao.baidu.com/question/ ...

  5. java utils

    1.获取resouces中文件的绝对路径 String filePath = XXX.class.getClassLoader().getResource("/configs/interfa ...

  6. webservice发布服务:AXIS2及客户端调用

    1.Axis2: 到官网下载axis2的压缩包. 解压后: 1.将lib文件下的jar包复制到项目中 2.在web-inf下创建services->META-INF->services.x ...

  7. 4. UIButton的使用

    1. UIButton的初认识 来自:http://www.cnblogs.com/mcj-coding/p/5103891.html QQ:853740091 1.1 UIButton 是iOS 开 ...

  8. Java笔记:对象,方法,类

    1.数据类型(类) 对象名; 这里要求数据类型必须为复合数据类型,基本数据类型声明的结构只能称为变量,而不能称为对象. 对象的初始化 对象名= new 构造方法(参数); 2.方法: 访问控制符 [修 ...

  9. python基础之文件操作

    对于文件操作中最简单的操作就是使用print函数将文件输出到屏幕中,但是这种操作并不能是文件保存到磁盘中去,如果下调用该数据还的重新输入等. 而在python中提供了必要的函数和方法进行默认情况下的文 ...

  10. hdu 1300 Pearls

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 思路:用dp[i]表示前i种花费最低的情况,则有dp[i]=min(dp[i],dp[j+1]+(( ...