httpclient和httpUrlConnect区别
HttpURLConnection的用法
一、创建HttpURLConnection对象
- URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp");
- URLConnection urlConnection = url.openConnection();
- HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
这个创建方法大家应该都很熟悉了,可能会认为下文中使用的HttpURLConnection的API的实现就在HttpURLConnection中了。这里要注意一下,其实这个HttpURLConnection是一个抽象类。
也就是说里面很多API函数都不在这儿实现的,那在哪实现呢。翻开java源码,可以看到,URL.openConnection()的实现是在java.net.URL类中。
- //java.net.URL类里面的openConnection方法:
- public URLConnection openConnection(Proxy proxy){
- …
- return handler.openConnection(this, proxy);
- }
- 这里的handler又是什么呢,跟进去,发现Handler是sun.net.www.protocol.http.Handler这个java类,继承java.net.URLStreamHandler类,是用来处理http连接请求响应的。 继续跟踪代码
- //Handler的方法
- protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException {
- return new HttpURLConnection(u, p, this);
- }
二、HttpURLConnection参数设置最终发现只是简单的生成了HttpURLConnection对象,其实最重要的HttpURLConnection就在这里了,这个是sun.net.www.protocl.http.HttpURLConnection类的对象,继承java.net.HttpURLConnection。也就是说我们之后所用的API实现都在sun.net.www.protocl.http.HttpURLConnection这个类里面。所以大家想要看HttpURLConnection的源码实现的话,需要到这个类中去查看。
好了,说了这么多,下面还是介绍HttpURLConnection常用的API的使用吧。
1、设置是否向httpUrlConnection输出,默认情况下是false。使用httpUrlConnection.getOutputStream(),把内容输出到远程服务器上。
- httpUrlConnection.setDoOutput(true);
2、设置是否从httpUrlConnection读入,默认情况下是true。使用httpUrlConnection.getInputStream(),从远程服务器上得到响应的内容。
- httpUrlConnection.setDoInput(true);
3、是否使用缓存。
- httpUrlConnection.setUseCaches(false);
4、设定传送的内容类型是可序列化的java对象 (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)。
- httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
5、设定请求的方法为”POST”,默认是GET 。
- httpUrlConnection.setRequestMethod("POST");
三、HttpURLConnection连接
1
2
3
|
httpUrlConnection.connect();
//此处getOutputStream会隐含的进行connect,所以在开发中不调用上述的connect()也可以
OutputStream outStrm = httpUrlConnection.getOutputStream();
|
四、HttpURLConnection写数据与发送数据
- // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。
- ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
- // 向对象输出流写出数据,这些数据将存到内存缓冲区中
- objOutputStrm.writeObject(new String("我是测试数据"));
- // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
- objOutputStm.flush();
- // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
- // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
- objOutputStm.close();
- // 调用HttpURLConnection连接对象的getInputStream()函数,
- // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
- // <===注意,实际发送请求的代码段就在这里
- InputStream inStrm = httpConn.getInputStream();
五、HttpURLConnection注意事项
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。
引用资料
httpclient和httpUrlConnect区别的更多相关文章
- Android’s HTTP Clients (httpClient 和 httpURLConnect 区别)
来源自:http://android-developers.blogspot.jp/2011/09/androids-http-clients.html Most network-connected ...
- HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 今天我们来聊一下他们之间的关系与区别. HttpRequest 类 .NET Fr ...
- HttpClient 4.3连接池参数配置及源码解读
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
- 网易内推(Android) 拿offer
学校BBS上师兄发网易内推,凑下热闹投了一发 一面:电话面 大概25分钟,感觉面试官气场很足,主要关注了其中一个 个人开源项目 1.自我介绍 2.说说你做的这个项目 当时谈到使用到了开源框架xtuil ...
- Android 第二波
三面,4个技术人员面试的问题不是很难.问题如下: 1. Service两种方式的区别 首先说service分为两种,一种是绑定的一种是非绑定的非绑定的生命周期是 onCreate(),onStartC ...
- Atitit s2018.5 s5 doc list on com pc.docx v2
Atitit s2018.5 s5 doc list on com pc.docx Acc 112237553.docx Acc Acc 112237553.docx Acc baidu ne ...
- Spring RestTemplate 小结
关于RestTemplate 首先,你可以把它理解为一个发起请求并接收响应的工具类(功能类似浏览器). 其次,它其实是一个壳,具体还是通过调用别的接口来实现(如jdk自带的连接,或者HttpClien ...
- HttpClient4.3 连接池参数配置及源码解读
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
- HttpClient和HttpURLConnection的使用和区别(下)
转自来自点击打开链接 接着上一篇,我们继续来分析HttpURLConnection的使用,以及两者的共同点和区别. 目录 用法 HttpURLConnection 区别 引用资料 用法 HttpURL ...
随机推荐
- <记录> PHP 缓存区ob
介绍: ob是output buffering的简称,输出缓冲区,缓冲区是通过php.ini中的output_buffering变量控制的.其默认值是off,可以设置为on来打开buffer.打来bu ...
- ThinkPHP输入验证和I方法使用
在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. ...
- 使用STM32CubeMX生成RTC工程[闹钟中断]
使用的硬件为正点原子的MINISTM32. 需要主要注意: STM32F1系列 <UM1850 User manual Description of STM32F1xx HAL drivers ...
- 源码编译php5.4 ./configure参数
./configure \--prefix=/usr/local/php/5.4 \--with-config-file-path=/usr/local/php/5.4/etc \--with-con ...
- day40-socket编程
一.socket介绍 看socket之前,先来回顾一下五层通讯流程: 但实际上从传输层开始以及以下,都是操作系统帮咱们完成的 Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象 ...
- 常用jqueryPlugin
http://www.jq22.com editable-select : jQuery可编辑可下拉插件jquery.editable-select.js
- jquery接触初级----jquery 对象和Dom对象
1. DOM 对象,每一份DOm对象(Document Object model)都可以表示成一棵树,一个基本的网页如下: <!DOCTYPE html> <html lang=&q ...
- Eclipse SVN文件冲突及不能直接提交情况
下图为Eclipse SVN使用过程中存在文件冲突的情形. 以下是三种冲突情形及相应解决办法: 1.简单的文件版本冲突 情形:A改变了文件的头部,B改变了文件的尾部,如果两者改动互不影响,SVN可以智 ...
- U3D的结构体堆分配栈分配
ST ot;//分配在栈上 ST[] arrt = new ST[2];//分配在堆上,因为数组是引用
- centos 卸载和安装软件
rpm -qa 列出所有已安装软件包 rpm -e packagename 删除软件包 rpm -e --nodeps packagename 强制删除软件和依赖包 rpm -q 包名 查 ...