Android 网络交互(一) HTTP post和get方法区别

来源:互联网 发布:java socket视频教程 编辑:程序博客网 时间:2024/06/08 10:29

本来这篇文章应该是Android源码分析Framework层的WindowManager的,但是一是由于公司最近有点忙,工作忙是其一,还有就是由于公司部门现在时局动荡,内忧外患的感觉,让我自己也有点躁动,很多事情都被拖延了脚步,再加上项目的一些新需求和老版本遗留的bug,真是捉急啊。写这篇文章,是最近公司安排我去面试一下实习生和全职的同学,让我倍感压力啊,说实话我也才学没多久,不能误人子弟啊,所以得充电下。(实习生大部分很少看源码,可能刚接触Android吧,不过还是强烈建议大家多看看底层的源码,这样对你的能力提高,和代码质量规范都是很有帮助的,有些全职的同学也没怎么看,可能是工作太忙了吧。)

废话不多说,写这篇文章,也是在面试中有问过的,现在就我的理解,给大家分析下。

HTTP:超文本传送协议(hypertext transport protocol)是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。 HTTP采用了请求/响应模型。客户端向服务器发送的请求包含了:请求的方法、URL、协议版本、请求修饰符、客户信息和内容的消息结构。服务器端以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码、服务器信息、实体元信息以及可能的实体内容。

HTTP协议特点:支持C/S模式。快捷(只需要传请求方法和路径),灵活(数据多样性),(HTTP 1.0无连接("一次连接",客户端发送的每次请求都需要服务器回送响应服务器处理完相应,客户端收到应答后,立即断开连接),无状态(服务器没有保存客户端的状态信息,必须重传)。在HTTP 1.1版本支持了持续连接,因为1.0的时候HTTP协议规定为获取每个URL资源都需要使用单独的一个TCP连接,这增加了HTTP服务端的负载,引起互联网拥塞,为了解决这个缺陷,而HTTP 1.1版本提供了持续连接。即在一个TCP连接上可以传送多个HTTP请求和响应。

优点:1.减少TCP连接数量2.在一个连接上实现HTTP请求和应答的流水,即允许客户端发出多个请求,而不必在接收到前一请求的应答后才发出下一请求,极大减少时间消耗 
后续请求延迟减少,无需再在TCP握手上耗时。

HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。

URL,全称:统一资源定位符(Uniform Resource Locator),它可以理解为网络上的资源。

HTTP中GET是获取/查询资源信息,POST是更新资源信息,PUT是请求服务器存储资源(可以通过get和post实现),DELETE是请求服务器删除资源(可以通过get和post实现)。

根据 HTTP 规范,GET 用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。(仅仅是针对是否改变资源)

幂等的概念简要介绍下:幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。幂等性是指一次和多次请求某一个资源应该具有同样的副作用(意味着对同一 URL 的多个请求应该返回同样的结果)。幂等性是分布式系统设计中十分重要的概念,而HTTP的分布式本质也决定了它在HTTP中具有重要地位。

根据HTTP规范,POST表示可能修改变服务器上的资源的请求下面来浅析下具体的区别:

1.请求方式:GET是从服务器上获取数据,POST是向服务器传送数据。

2.数据参数:为了理解两者在传输过程中的不同,我们先看一下HTTP协议的格式:

 HTTP请求:

<request line>

<headers>

<blank line>

<request-body>

第一行是请求行,用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header),给服务传的参数。在首部之后是一个空行,再此之后可以添加任意的其他数据称之为主体(body)。

源码实例:

GET  /s??ie=utf-8&f=8&rsv_bp=1&tn=%E4%BD%A0 HTTP/1.1

..........
Connection: Keep-Alive

POST / HTTP/1.1

..........

Connection: Keep-Alive
    (----此处空一行----)
name=Professional%20Ajax&publisher=Wiley

GET提交,把参数加到提交表单的URL中,值和表单内各个字段一一对应,在URL中可以看到。数据参数会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例如:/s??ie=utf-8&f=8&rsv_bp=1&tn=%E4%BD%A0。如果数据是英文字母/数字,原样发送,如果是空格,转换为+号,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:post是通过HTTPpost机制,将数据放置在是HTTP包的包体中,相当于封装了一下数据。上文示例中红色字体标明的就是实际的传输数据。

3.数据大小:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。但是在实际的开发中有限制,特定的浏览器及服务器对它的限制。

因为GET是通过URL传输数据的,所以GET方式提交的数据最多不能超过1024字节。

然而理论上讲POST是没有大小限制的,HTTP协议规范也没有对其进行限制,起限制作用的是服务器。

4.安全性:POST比GET安全性更高。注意下,这里有人会觉得疑惑了,刚才我之前介绍HTTP协议概念的时候,有提到GET请求的特性之一就是安全性,为什么这里又说POST的安全性高呢?这里说的安全性是针对数据的安全性来说的,在GET请求中,数据是明文传输,而POST的数据传输是不可见的,而且可加密(可用MD5).

5.服务器端的接收方式不同:GET请求的时候,服务器端用 Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

好了,基本的概念和区别已经给大家介绍完了,希望对大家有帮助,欢迎指正,我也在继续充电。

0 0
原创粉丝点击