Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)

Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)
Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)

HttpUrlConnection与HttpClient详解

一.概念。

在Android开发中,AndroidSDK中对HTTP提供了很好的支持,主要包括两种接口。

1.一个是Sun公司提供的库,基于标准Java接口的

HttpURLConnection,这个类封装的很少,如果使用高级功

能,如重访问/Cookie/Session等就相当不方便。它可以实现

简单的基于URL的请求与相应功能。Google在Android

Api23及以后的版本中推荐使用HttpURLConnention,在后

续版本中逐渐对其进行优化完善。在2.2版本以前,一直存

在着一些bug。比如对一个可读的InputStream调用close

方法时,可能会导致连接池失效。通常我们会禁用连接池功

能。

2.另一个是Apache公司提供的的HttpClient,它提供了高效的,

最新的功能丰富的api,支持Http协议工具包,支持HTTP

最新版本和建议,是个很好的开源框架,封装了http的请求,

参数,内容体,响应等,拥有众多API,但同时HttpClient

的API数量太多,如果不破坏兼容性的情况下想对他进行扩

展很麻烦。在API 23 SDK将其去掉了。建议使用

HttpURLConnection。

以上两种联网方式都支持HTTPS协议、以流的形式进行传输、

IPv6、配置超时时间、以及连接池等功能。

二.区别。

1.功能上,HttpClient库要丰富很多,提供了很多工具,封装了http

的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。

2.H ttpClient高级功能代码写起来比较复杂,对开发人员的要求会高

一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。

3.HttpURLConnection在2.3版本增加了一些HTTPS方面的改进,

4.0版本增加一些响应的缓存。

4.HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但

要自己写代码处理。

5.HttpUrlConnection直接支持系统级连接池,即打开的连接不会直

接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

6.HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本

以上),加快了重复请求的速度。

7.HttpClient 适用于web browsers, 他们是可扩展的,并且拥有大

量的稳定APIs。但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。

8.HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。这

个类起步比较晚,很容易在主要API上做稳步的改善。但是

HttpURLConnection在在Android 2.2及以下版本上存在一些令人厌烦的bug,尤其是在读取InputStream时调用close()方法,就有可能会导致连接池失效了。

9.Android团队未来的工作会将更多的时间放在优化

HttpURLConnection上,它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。

10.如果一个Android应用需要向指定页面发送请求,但该页面并不

是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。这种情况建议使用HttpClient。

11.Android2.3及以上版本建议选用HttpURLConnection,2.2及以

下版本建议选用HttpClient。新的应用都建议使用

HttpURLConnection。

三.HttpClient访问网络流程。

由于在Android2.2以后版本中已经将HttpClient弃用,所以不在这里详细说明如何使用HttpClient进行网络通信了,下面说一

下使用HttpClient发送请求及接收响应的大概步骤:

1.创建HttpClient。

2.创建HttpGet或者HttpPost对象(分别对应get,post方式)。

3.调用HttpGet或者HttpPost的setParams()方法设置请求参数,

如果是HttpPost,还可以通过setEntity()方式设置请求参数。

4.调用HttpCLient的excute(HttpUriRquest request)方法发送

请求。会返回一个HttpResponse对象。

5.HttpRespsonse的getHeaders(String name)与

getAllHeaders()方法获取服务端返回的响应头,还可以调用

HttpResponse的getEntity()方法获取相应对象,该对象包

装了服务端的返回内容。我们可以从中进行读取。四.HttpURLConnetion类get与post实现

1.get方式访问百度网站

package com.lyl.demo;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import https://www.360docs.net/doc/3b15257838.html,.HttpURLConnection;

import https://www.360docs.net/doc/3b15257838.html,.URL;

public class Comparison {

public static void main(String[] args) {

String reString=

urlConnectionGet("https://www.360docs.net/doc/3b15257838.html,");

System.out.println(reString);

}

public static String urlConnectionGet(String path){

try {

URL url = new URL(path.trim());

//打开连接

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

if(200 == urlConnection.getResponseCode()){

//得到输入流

InputStream is =urlConnection.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = 0;

while(-1 != (len = is.read(buffer))){

baos.write(buffer,0,len);

baos.flush();

}

return baos.toString("utf-8");

}

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

}

2.post方式

package com.lyl.demo;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import https://www.360docs.net/doc/3b15257838.html,.HttpURLConnection;

import https://www.360docs.net/doc/3b15257838.html,.MalformedURLException;

import https://www.360docs.net/doc/3b15257838.html,.URL;

public class PostMethod {

public static void main(String[] args) {

httpPost();

}

public static void httpPost() {

try {

URL url = new URL("");

HttpURLConnection connection = (HttpURLConnection) url .openConnection();

connection.setConnectTimeout(5 * 1000);

connection.setReadTimeout(5 * 1000);

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setUseCaches(false);

connection.setRequestMethod("POST");

//

connection.setRequestProperty("Connection","keep-Alive");

connection.setRequestProperty("Charset", "utf-8");

//

connection.setRequestProperty("Content-type","application/x-ww

w-");

String params = "page = 1 & num = 10";

OutputStream os = connection.getOutputStream();

os.write(params.getBytes());

os.flush();

os.close();

if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {

InputStream is = connection.getInputStream();

StringBuilder sb = new StringBuilder();

byte[] bytes = new byte[1024];

int i = 0;

while ((i = is.read(bytes)) != -1) {

sb.append(new String(bytes, 0, i, "utf-8"));

}

is.close();

System.out.println("LYL_read:" + sb);

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

五.参考文献

1.https://www.360docs.net/doc/3b15257838.html,/liushuibufu/p/4140913.html

相关主题
相关文档
最新文档