Android从业者,十之八九都是在做网络应用,不是互联网也是局域网。如今在4G和Wifi的天下下,流量什么的都已是浮云,单机应用的市场已然悄悄的一去不复返了。所以呢,不了解网络请求的同学要小心了,当心被时代的大浪一个浪头排在沙滩上。
Android实现网络编程有HTTP、也有Socket。HTTP协议是应用层协议,主要解决如何包装数据,网络应用都会用到的协议;Socket是TCP/IP协议的封装,主要解决数据如何在网络中传输,常用于与服务器保持长连接,一般用于广告推送、实时聊天、在线游戏等。
如果你的工作范围不涉及到上述这些需求,一般你也用不到Socket。今天我们的主题是android中HTTP请求实现。HTTP请求方法有很多,GET,POST,HEAD,DELETE等,常用的有GET、POST。一般来说,这两个请求方法也足以解决工作中的需要了,GET用于查询请求,POST用于提交修改请求。有兴趣的同学也可以去网上查查资料,多了解了解HTTP请求的数据体格式、响应码,而且最近HTTP协议新的标准也发布了,可以看看。
下面说说GET与POST这两种请求方式的异同,理解后便于对接口的调用,其实主要也都是后台的同学为我们定义好的。简单点理解,GET是向服务器获取数据,POST是向服务器传送数据;GET请求是把请求参数以可见的形式拼接到url后面,其实是封装在header里面,安全性较低,POST请求是把请求参数放到body中去,用户看不到执行的过程,安全性较高;GET传输数据长度有限制,也就2KB,所以不能用来上传文件,而POST请求原则上就没有限制,但是考虑到网络的稳定性和服务器的安全性,一般也都给设置上传文件的长度阀值,所以常用来上传文件。其实GET和POST也是有共同点的,比如说可以通过设置expires属性,使请求缓存。
我们Android中实现HTTP请求,原生支持两种实现方式。一种是JavaSE内置的网络请求类,一种是采纳Apache的HttpClient。在Java中有个网络相关的包java.net.*,这个包中封装了一系列需要用到与网络请求相关的类,比如说HttpURLConnection和URL,基于这两个类封装了一个请求工具类;另一种就是HttpClient,被Java开发者广泛使用,拥有更加简单的api和更强的效率,所以才被谷歌采纳在Android的api里面,相对于HttpURLConnection我也写了一个工具类,把上个工具类的所有方法都给重新实现了一遍。这两个工具类基本能满足日常的工作开发需要,大家有兴趣可以到Github上拉取。
下面简单讲解下这两个网络操作工具类的作用。先看下Javadoc生成的方法概要,由于两个类的方法是一样的,只以ApacheHttpUtil来说。考虑到了工具类的多次调用,为了方便和效率,把所有的方法都声明为static。
GET请求有两个方法,一个是没有请求参数的,一个是为了满足有参数的情况。参数的封装统一使用Map键值对的形式,更易理解使用,使用Map也更有效率。ApacheHttpUtil会自动拼装,你只需把你的请求参数以Map的形式传过来,然后成功得到服务器返回的字符串结果。
POST请求对外接收的参数是一样的,首先把Map集合转成NameValuePair列表,然后塞到Http实体body里面去,然后成功得到服务器返回的字符串结果。
最后一个方法用在有文件上传的时候,支持上传多个文件,同时提交文本参数。只需要传值过来文本参数列表,文件本地路径地址列表,这样就算大功告成了,HttpClient会帮我们封装一切,实在比Java原生的好用很多倍。想看下原生给人造成的麻烦,就参考NativeHttpUtil这个类里面的实现吧。
源码地址:https://github.com/JackCho/AndroidHttpUtil
好了,分享到此结束。帮一个朋友广告,是一位Android大牛,年纪轻轻的他放弃了30W年薪的优厚待遇,选择了自己创业全职做Android教育培训。
详情请访问《年薪三十万,我为什么要离职。》http://www.cnblogs.com/stay/p/3859211.html
如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。