您的位置:首页 > 理论基础 > 计算机网络

HttpURLConnection和HTTPClient的比较

2016-07-05 19:29 387 查看
      HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。 

       HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

 
int getResponseCode():获取服务器的响应代码。
String getResponseMessage():获取服务器的响应消息。
String getResponseMethod():获取发送请求的方法。
void setRequestMethod(String method):设置发送请求的方法。

       在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。

       为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。

       简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收
响应,以及管理HTTP连接。

    使用HttpClient发送请求、接收响应很简单,只要如下几步即可。

创建HttpClient对象。
如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

对比项目URLConnectionHTTPClient
提交方式(Methods)HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONSHEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, WEBDav, IPP, 甚至各种自定义提交方式
响应(Response Codes)只能获取http状态码小于400的状态码,响应头信息(headers),响应内容.对于响应状态码为4xx或者5xx获取response的任何信息都只会抛出IOException任何时候都可以获取响应的任何信息:响应状态码,响应头信息,响应内容信息等等。
代理和SOCKS支持,SOCKS仅支持4支持,SOCKS支持4和5
认证(Authorization)支持Basic、早期的Digest JDK1.2+(不支持现在的Digest authentication),甚至不能处理apache返回的Digest信息支持Basic、Digest Authentication、自定义的其他认证方案
Cookies不支持支持
请求输出流

(True request output streams)
请求发送之前,所有的数据都被缓存起来通过socket直接输出HttpOutputStream
响应输入流

(True response input streams)
JDK1.2-支持,1.3+不支持chunked encoding(不支持大多数推送服务器的响应)支持
长连接

(Persistent Connections)
JDK1.2- HTTP/1.0 Keep-Alive,JDK1.3+  HTTP/1.1 Persistent支持HTTP/1.0 Keep-Alive 和 HTTP/1.1 Persistent
Pipelining of Requests不支持支持
设置超时不支持支持
处理HTTP之外的协议支持如:ftp, gopher, mailto,文件系统不支持
处理HTTPs支持部分SSL,如JSSE,前提是客户端必须安装可以通过补丁的方式使用免费或者收费的SSL
开源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: