HttpURLConnection的用法

一、创建HttpURLConnection对象

  1. URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp");
  2. URLConnection urlConnection = url.openConnection();
  3. HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
  • 这个创建方法大家应该都很熟悉了,可能会认为下文中使用的HttpURLConnection的API的实现就在HttpURLConnection中了。这里要注意一下,其实这个HttpURLConnection是一个抽象类。

  • 也就是说里面很多API函数都不在这儿实现的,那在哪实现呢。翻开java源码,可以看到,URL.openConnection()的实现是在java.net.URL类中。

  1. //java.net.URL类里面的openConnection方法:
  2. public URLConnection openConnection(Proxy proxy){
  3. return handler.openConnection(this, proxy);
  4. }
  • 这里的handler又是什么呢,跟进去,发现Handler是sun.net.www.protocol.http.Handler这个java类,继承java.net.URLStreamHandler类,是用来处理http连接请求响应的。 继续跟踪代码

    1. //Handler的方法
    2. protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException {
    3. return new HttpURLConnection(u, p, this);
    4. }
  • 二、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(),把内容输出到远程服务器上。

  1. httpUrlConnection.setDoOutput(true);

2、设置是否从httpUrlConnection读入,默认情况下是true。使用httpUrlConnection.getInputStream(),从远程服务器上得到响应的内容。

  1. httpUrlConnection.setDoInput(true);

3、是否使用缓存。

  1. httpUrlConnection.setUseCaches(false);

4、设定传送的内容类型是可序列化的java对象 (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)。

  1. httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");

5、设定请求的方法为”POST”,默认是GET 。

  1. httpUrlConnection.setRequestMethod("POST");

三、HttpURLConnection连接

1
2
3
httpUrlConnection.connect();
//此处getOutputStream会隐含的进行connect,所以在开发中不调用上述的connect()也可以
OutputStream outStrm = httpUrlConnection.getOutputStream();

四、HttpURLConnection写数据与发送数据

  1. // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。
  2. ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
  3. // 向对象输出流写出数据,这些数据将存到内存缓冲区中
  4. objOutputStrm.writeObject(new String("我是测试数据"));
  5. // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
  6. objOutputStm.flush();
  7. // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
  8. // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
  9. objOutputStm.close();
  10. // 调用HttpURLConnection连接对象的getInputStream()函数,
  11. // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
  12. // <===注意,实际发送请求的代码段就在这里
  13. 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。

引用资料


  1. HTTP和SOCKET连接区别

  2. HttpClient 教程

  3. HttpClient和HttpURLConnection的区别

  4. HttpURLConnection VS HttpClient性能测试

httpclient和httpUrlConnect区别的更多相关文章

  1. Android’s HTTP Clients (httpClient 和 httpURLConnect 区别)

    来源自:http://android-developers.blogspot.jp/2011/09/androids-http-clients.html Most network-connected ...

  2. HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别

    HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 今天我们来聊一下他们之间的关系与区别. HttpRequest 类 .NET Fr ...

  3. HttpClient 4.3连接池参数配置及源码解读

    目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...

  4. 网易内推(Android) 拿offer

    学校BBS上师兄发网易内推,凑下热闹投了一发 一面:电话面 大概25分钟,感觉面试官气场很足,主要关注了其中一个 个人开源项目 1.自我介绍 2.说说你做的这个项目 当时谈到使用到了开源框架xtuil ...

  5. Android 第二波

    三面,4个技术人员面试的问题不是很难.问题如下: 1. Service两种方式的区别 首先说service分为两种,一种是绑定的一种是非绑定的非绑定的生命周期是 onCreate(),onStartC ...

  6. 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 ...

  7. Spring RestTemplate 小结

    关于RestTemplate 首先,你可以把它理解为一个发起请求并接收响应的工具类(功能类似浏览器). 其次,它其实是一个壳,具体还是通过调用别的接口来实现(如jdk自带的连接,或者HttpClien ...

  8. HttpClient4.3 连接池参数配置及源码解读

    目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...

  9. HttpClient和HttpURLConnection的使用和区别(下)

    转自来自点击打开链接 接着上一篇,我们继续来分析HttpURLConnection的使用,以及两者的共同点和区别. 目录 用法 HttpURLConnection 区别 引用资料 用法 HttpURL ...

随机推荐

  1. 最全的select加锁分析(Mysql)

    引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? s ...

  2. delphi RTTI 四 获取类属性列表

    delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...

  3. php7内核执行流程(转载留记录)

  4. dshow采集过程

    捕捉静态图片常用的filter是Sample Graber filter,它的用法参考手册.然后将捕捉filter的静态PIN连接到Sample Grabber,再将Sample Grabber连接到 ...

  5. U3D MemoryProfiler

    MemoryProfiler Unity 5.3a4 has a new very lowlevel memory profiler API. It can tell you which object ...

  6. vim主题设定

    Vim的颜色主题在/usr/share/vim/vim74/colors文件夹里. 打开vim后在normal模式下输入“:colorscheme”查看当前的主题,修改主题使用命令“:colorsch ...

  7. linux 排查page的状态问题

    最近遇到一个page的释放异常的问题,堆栈如下: [ 1000.691858] BUG: Bad page state in process server.o pfn:309d22 [ mapcoun ...

  8. windows下如何查看端口,关闭端口,开启端口

    如何查看端口 在Windows 2000/XP/Server 2003中要查看端口,可以使用NETSTAT命令: “开始">"运行”>“cmd”,打开命令提示符窗口.在 ...

  9. django 认证系统--3

    WEB request中的认证 django使用sessions和middleware和reqeust对象联系在一起 它们通过给每一个reqeust请求添加一个request.user属性来代表当前用 ...

  10. JAVAWEB 一一 SpringMVC(注解)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...