这个建立方法你们应该都很熟悉了,可能会认为下文中使用的HttpURLConnection的API的实现就在HttpURLConnection中了。这里要注意一下,其实这个HttpURLConnection是一个抽象类。html
也就是说里面不少API函数都不在这儿实现的,那在哪实现呢。翻开java源码,能够看到,URL.openConnection()的实现是在java.net.URL类中。java
2、HttpURLConnection参数设置最终发现只是简单的生成了HttpURLConnection对象,其实最重要的HttpURLConnection就在这里了,这个是sun.net.www.protocl.http.HttpURLConnection类的对象,继承java.net.HttpURLConnection。也就是说咱们以后所用的API实现都在sun.net.www.protocl.http.HttpURLConnection这个类里面。因此你们想要看HttpURLConnection的源码实现的话,须要到这个类中去查看。web
好了,说了这么多,下面仍是介绍HttpURLConnection经常使用的API的使用吧。缓存
一、设置是否向httpUrlConnection输出,默认状况下是false。使用httpUrlConnection.getOutputStream(),把内容输出到远程服务器上。服务器
二、设置是否从httpUrlConnection读入,默认状况下是true。使用httpUrlConnection.getInputStream(),从远程服务器上获得响应的内容。网络
三、是否使用缓存。app
四、设定传送的内容类型是可序列化的java对象 (若是不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)。jsp
五、设定请求的方法为”POST”,默认是GET 。tcp
1
2
3
|
httpUrlConnection.
connect();
//此处getOutputStream会隐含的进行connect,因此在开发中不调用上述的connect()也能够
OutputStream outStrm = httpUrlConnection.getOutputStream();
|
1. HttpURLConnection的connect()函数,实际上只是创建了一个与服务器的tcp链接,并无实际发送http请求。不管是post仍是get请求,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。因此对outputStream的写操做,必需要在inputStream的读操做以前。 2. 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必需要在connect()函数执行以前完成。
功能用法对比函数
从功能上对比,HttpClient库要丰富不少,提供了不少工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、链接池的处理。
HttpClient高级功能代码写起来比较复杂,对开发人员的要求会高一些,而HttpURLConnection对大部分工做进行了包装,屏蔽了不须要的细节,适合开发人员直接调用。
另外,HttpURLConnection在2.3版本增长了一些HTTPS方面的改进,4.0版本增长一些响应的缓存。
性能对比
HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但要本身写代码处理。
HttpUrlConnection直接支持系统级链接池,即打开的链接不会直接关闭,在一段时间内全部程序可共用;HttpClient固然也能作到,但毕竟不如官方直接系统底层支持好。
HttpUrlConnection直接在系统层面作了缓存策略处理(4.0版本以上),加快了重复请求的速度。
这篇文章对二者的速度作了一个对比,作法是两个类都使用默认的方法去请求百度的网页内容,测试结果是使用httpurlconnection耗时47ms,使用httpclient耗时641ms。httpURLConnection在速度有比较明显的优点,固然这跟压缩内容和缓存都有直接关系。
将来发展
HttpClient 适用于 web browsers, 他们是可扩展的,而且拥有大量的稳定APIs。可是,在不破坏其兼容性的前提下很难对如此多的APIs作修改。所以,Android 团队对修改优化Apache HTTP Client表现的并不积极。
HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。这个类起步比较晚,很容易在主要API上作稳步的改善。可是HttpURLConnection在在Android 2.2及如下版本上存在一些使人厌烦的bug,尤为是在读取 InputStream时调用 close()方法,就有可能会致使链接池失效了。
Android团队将来的工做会将更多的时间放在优化HttpURLConnection上,它的API简单,体积较小,于是很是适用于Android项目。压缩和缓存机制能够有效地减小网络访问的流量,在提高速度和省电方面也起到了较大的做用。
选用建议
若是一个Android应用须要向指定页面发送请求,但该页面并非一个简单的页面,只有当用户已经登陆,并且登陆用户的用户名有效时才可访问该页面。若是使用HttpURLConnection来访问这个被保护的页面,那么须要处理的细节就太复杂了。这种状况建议使用HttpClient。
Android2.3及以上版本建议选用HttpURLConnection,2.2及如下版本建议选用HttpClient。新的应用都建议使用HttpURLConnection。