起名困难户,每次写文章最愁的就是不知道该如何起个稍具内涵的名字,如果这篇文章我只是写写Get和Post的区别,我可以起个名字“Get和Post的那点事”,如果打算阐述一下Http协议原理性内容,那该叫“Http中你不知道的那些事”,两者都不是我想要的,前者太过浅薄,后者太过深奥,已超出本人的能力范围,于是我只能写点Http,Get,Post和个稀泥大家就将就着看一下,开头很多废话的毛病我发现我是越来越难改了,进入正题吧~

Http

HTTP(Hypertext transfer protocol),先说下着几个单词,Hypertext是超文本(除了HTML外,也可以是带有超链接的XML或JSON),protocol是协议,transfer翻译应该是移交(也可以翻译成传输,运输,还有一个更具体的词是transport),最开始学校学习Http的所有市面能见到的书籍都翻译成超文本传输协议,Http设计的本身是为了移交和操作资源,并不是为了传输资源.最开始的的网站都是静态内容类似今天云盘,实现了资源共享,URL(Uniform Resoure Locator:统一资源定位符)用来映射网上的资源,为了大家能统一的访问web资源,Http提供了几种方法访问资源.

Http协议中定义了与服务器之间交互的八个方法:get(获取资源),post(向指定资源提交数据进行处理请求,增加或者更新资源),put(向指定资源位置上传其最新内容 ),delete(请求服务器删除Request-URI所标识的资源);

head(主机端响应Client端的一些数据文件头),options(主机端响应Client端的一些允许的功能与方法。返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性),trace(回显服务器收到的请求,主要用于测试或诊断),connect(HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器)。以前出去面试的时候只知道有get和post请求,对于其他一概不知,现在想来有点惭愧。

Get和Post的基础概念

HTTP协议本身是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不同的方式:一种是RESTful的,它把HTTP当成应用层协议,比较忠实地遵守了HTTP协议的各种规定;另一种是SOA的,它并没有完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后在HTTP之上建立了自己的应用层协议。

说到这里不得不说到一个大神级的人Roy Thomas Fielding,维基上有详细英文介绍,我说下中文介绍,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。基于以上的工作经历他写了一个篇让人惊叹的博士论文Architectural Styles and the Design of Network-based Software Architectures,中文名叫架构风格与基于网络应用软件的架构设计(下载链接:http://pan.baidu.com/s/1bnGQUsv).

论文中提出了一个REST(REpresentational State Transfer即表现层状态转移)架构。对应的就是上面的RESTFUL的使用方式,项目中没有用到过,看过一点一点皮毛,园友有兴趣的可以自己研究一下~Get和Post这两哥们用的太广泛了,而且面试的时候基本上跟递归一样是打开共同话题的谈资,还是看概念吧~

1.按照最开始Http协议的设计,,GET用于获取资源,而且应该是安全的和幂等的。

安全和幂等属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它。按照规范讲get只用于获取服务器资源,但是你用get执行了其他操作,虽然违反了规范,也不会有影响。幂等属于数学中的概念,简单说下吧:

一元运算时,其作用在任一元素两次后会和其作用一次的结果相同。例如,a的绝对值的绝对值等于a,abs(a)=abs(abs(a))。
二元运算时,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和1,0*0=0。
 2.按照最开始Http协议的设计,post用于增加资源或者更新资源。 

Get和Post异同点

异同点网上随便找找,满大街都是,既然要写了,我还是免不了俗,尽量按照自己理解的方式去比较:

1.可见性,get访问时URL是所有人都可见的,post则是不可见的.

2.长度限制,get和post传递长度都是是没有限制的(不知道是自己当时没学好还是老师误人子弟说get是有长度限制的,很长一段时间以为get请求长度为1kb),get是放在URL一起去请求的,浏览器限制了URL的长度,导致get传递的参数不能太长.URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。只是浏览器上有限制,不同浏览器限制不一样,IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。对于Firefox浏览器URL的长度限制为65,536个字符,但当我测试时,最大只能处理8182个字符,这是因为url的长度除了浏览器限制外,还会受Web服务器的限制。Safari中url最大长度限制为 80,000个字符。OperaURL最大长度限制为190,000个字符。Chrome对url长度限制为8182个字符。

POST是请求大小是没有限制的,Web服务器会对post请求进行控制,以IIS7为例

在如下路径C:\Windows\System32\inetsrv\config\schema找到IIS_schema.xml,在其中搜索一下 name="requestLimits",就会看到三个配置。

<attribute name="maxAllowedContentLength" type="uint" defaultValue="30000000" /> 
<attribute name="maxUrl" type="uint" defaultValue="4096" />
<attribute name="maxQueryString" type="uint" defaultValue="2048" />

postIIS请求限制为最多为28.6M,get请求IIS限制为2KB,如有需要可根据需求修改长度大小.

3.安全性,与 post相比,get的安全性较差,因为所发送的数据是 URL 的一部分(登录的时候提交数据应该没人会用get),post比get更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。

4.数据类型,get只允许 ASCII 字符,post传递没有限制,也允许二进制数据。

5.编码类型,form的enctype属性为表单控件的内容编码方式,常用有两种:application/x-www-form-urlencoded(默认)和multipart/form-data,不管get还是post都可以使用这两种编码方式, 当表单中含有type=file文件控件的时候发送方式只能使用post,内容编码方式只能使用multipart/form-data.

6.书签,缓存,get请求可以收藏为书签,能被缓存,post不可以被收藏为书签,不可以被缓存.

7.取值方式,ASP.NET中对get请求使用Request.QueryString取值,对Post请求使用Request.Form取值,如果偷懒的话直接用Request两者通用,JSP对get请求使用request.QueryString("");取值,对Post请求使用request.getParameter("");取值,你也可以直接用request.getParameter("")获取get请求中的数据.在PHP中,可以用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获取GET和POST两种请求中的数据。

[参考资料]

http://www.infoq.com/cn/minibooks/dissertation-rest-cn

http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

http://www.infoq.com/cn/articles/understanding-restful-style#anch100832

http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

Http协议中Get和Post的浅谈的更多相关文章

  1. Web UI自动化测试中绕开验证码登陆方式浅谈

    web自动化测试中让测试者感到困惑的是登陆验证码,每次都不一样.现在推荐一种绕开验证码登陆的方式,其实就是将web浏览器获取的登陆cookie加载到程序中就可以了,这样程序就会认为你已经登陆,就可以跳 ...

  2. ava中Class.forName的作用浅谈

    转自:http://www.jb51.net/article/42648.htm Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载 ...

  3. 关于vue中tamplate和DOM节点浅谈

    前言:在开发前段页面使用vue时,我们能经常看到template标签.这里粗略讲下自己对vue中template理解和使用. 1. 先了解vue vue.js是一个轻巧.高性能.壳组件画的MVVM库. ...

  4. 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想

    K&R习题1-23中,要求“编写一个程序,删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不允许嵌套”. 如果不考虑字符常量和字符串常量,问题确实很简单.只 ...

  5. PHP中MVC的编程思想浅谈

    我相信这样的文章已经被写烂了,但是我今天还是愿意冒着风险把自己的经验与大家分享一下.纯属原创,我也没什么可保留,希望对新手有帮助,有说的什么不对的地方,欢迎大家伙吐槽. 什么是MVC? 简单的说就是将 ...

  6. java中Switch的实现原理浅谈

    switch的转换和具体系统实现有关,如果分支比较少,可能会转换为跳转指令(条件跳转指令和无条件跳转指令).但如果分支比较多,使用条件跳转会进行很多次的比较运算,效率比较低,可能会使用一种更为高效的方 ...

  7. java中的装饰设计模式,浅谈与继承之间的区别

    最初接触装饰设计模式,一直搞不懂这么做的意义是什么,看了网上很多的资料,对于与继承的区别并没有很清楚的分析,直到看到这篇博客:http://www.cnblogs.com/rookieFly-tdii ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. MVC5-11 浅谈拦截器

    Filter拦截器 Aop是MVC的主要设计方式之一,而微软也希望我们在使用MVC的时候更好的使用拦截器来进行切面编程.拦截器则是Mvc中的一大亮点与重点 AOP(面向切面)编程已经广泛应用在各个项目 ...

随机推荐

  1. [POI2013]Taksówki

    [POI2013]Taksówki 题目大意: ABC三地在同一条直线上,AC相距\(m(m\le10^{18})\)米,AB相距\(d\),B在AC之间.总共有\(n(n\le5\times10^5 ...

  2. Eclipse添加Spket插件实现ExtJs智能提示

    1 . 开发环境 MyEclipse 12.0.0 ExtJs 4.2.1.883 Spket 1.6.23 2 . 下载资源 extjs 4.2.1.883 - http://www.sencha. ...

  3. shell脚本调用C语言之字符串切分函数——strtok

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...

  4. [多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?(转)

    昨天有一个比较爱思考的同事和我提起一个问题:为什么匿名内部类使用的局部变量和参数需要final修饰,而外部类的成员变量则不用?对这个问题我一直作为默认的语法了,木有仔细想过为什么(在分析完后有点印象在 ...

  5. mysql exists 如何使用

    还没时间看,exists用的少  ==>当你只需要判断后面的查询结果是否存 在时使用exists() http://edu.codepub.com/2011/0208/29218.php 今天正 ...

  6. delphi Ribbon 111

    Ribbon上包含以下一些元素,如图所示: 元素对应API: Element Ribbon API Quick Access Toolbar RibbonControl.ToolbarRibbonQu ...

  7. [Asp.net mvc]国际化

    摘要 在实际项目中,经常遇到,开发的项目要提供给不同的国家使用,如果根据国家来开发不同的站点,肯定是非常耗时又耗成本的.asp.net中,提供了一种比较方便的方式,可以使用资源文件的方式,使我们的站点 ...

  8. PHP 7 来了,PHP 6 去哪儿了?

    PHP7来了,那么PHP6去哪儿了呢? PHP7简介 PHP7是PHP编程语言全新的一个版本,主要在性能方面获得了极大的提升.官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能.同时还 对PH ...

  9. AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器

    本篇AutoMapper使用场景: ※ 源字典集合转换成目标字典集合 ※ 枚举映射 ※ 自定义解析器 ※ 源中的复杂属性和Get...方法转换成目标属性 源字典集合转换成目标字典集合 □ Domain ...

  10. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(4) DateFormat

    本章主要介绍DateFormat. DateFormat 介绍 DateFormat 的作用是 格式化并解析“日期/时间”.实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date ...