`
renjie120
  • 浏览: 237712 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D11bba82-ec4a-3d31-a3c0-c51130c62f1c
Java应用集锦
浏览量:22911
社区版块
存档分类
最新评论

java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件

 
阅读更多

转账注明出处:http://renjie120.iteye.com/blog/1727933

 

在工作中要用到android,然后进行网络请求的时候,打算使用httpClient。

总结一下httpClient的一些基本使用。

版本是4.2.2。

 

使用这个版本的过程中,百度很多,结果都是出现的org.apache.commons.httpclient.这个包名,而不是我这里的org.apache.http.client.HttpClient----------前者版本是 Commons HttpClient 3.x ,不是最新的版本HttpClient 4.×。

 

官网上面:

 

Commons HttpClient 3.x codeline is at the end of life. All users of Commons HttpClient 3.x are strongly encouraged to upgrade to HttpClient 4.1.  

 

 

1.基本的get

 

public void getUrl(String url, String encoding)
			throws ClientProtocolException, IOException {
		// 默认的client类。
		HttpClient client = new DefaultHttpClient();
		// 设置为get取连接的方式.
		HttpGet get = new HttpGet(url);
		// 得到返回的response.
		HttpResponse response = client.execute(get);
		// 得到返回的client里面的实体对象信息.
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			System.out.println("内容编码是:" + entity.getContentEncoding());
			System.out.println("内容类型是:" + entity.getContentType());
			// 得到返回的主体内容.
			InputStream instream = entity.getContent();
			try {
				BufferedReader reader = new BufferedReader(
						new InputStreamReader(instream, encoding));
				System.out.println(reader.readLine());
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				instream.close();
			}
		}

		// 关闭连接.
		client.getConnectionManager().shutdown();
	}

 

2.基本的Post

   下面的params参数,是在表单里面提交的参数。

 

public void postUrlWithParams(String url, Map params, String encoding)
			throws Exception {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {

			HttpPost httpost = new HttpPost(url);
			// 添加参数
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			if (params != null && params.keySet().size() > 0) {
				Iterator iterator = params.entrySet().iterator();
				while (iterator.hasNext()) {
					Map.Entry entry = (Entry) iterator.next();
					nvps.add(new BasicNameValuePair((String) entry.getKey(),
							(String) entry.getValue()));
				}
			}

			httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));

			HttpResponse response = httpclient.execute(httpost);
			HttpEntity entity = response.getEntity();

			System.out.println("Login form get: " + response.getStatusLine()
					+ entity.getContent());
			dump(entity, encoding);
			System.out.println("Post logon cookies:");
			List<Cookie> cookies = httpclient.getCookieStore().getCookies();
			if (cookies.isEmpty()) {
				System.out.println("None");
			} else {
				for (int i = 0; i < cookies.size(); i++) {
					System.out.println("- " + cookies.get(i).toString());
				}
			}

		} finally {
			// 关闭请求
			httpclient.getConnectionManager().shutdown();
		}
	}

 

3。打印页面输出的小代码片段

 

private static void dump(HttpEntity entity, String encoding)
			throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(
				entity.getContent(), encoding));
		System.out.println(br.readLine());
	}

 

4.常见的登录session问题,需求:使用账户,密码登录系统之后,然后再访问页面不出错。

 

特别注意,下面的httpclient对象要使用一个,而不要在第二次访问的时候,重新new一个。至于如何保存这个第一步经过了验证的httpclient,有很多种方法实现。单例,系统全局变量(android 下面的Application),ThreadLocal变量等等。

 

       以及下面创建的httpClient要使用ThreadSafeClientConnManager对象!

 

   public String getSessionId(String url, Map params, String encoding,

			String url2) throws Exception {
		DefaultHttpClient httpclient = new DefaultHttpClient(
				new ThreadSafeClientConnManager());
		try {

			HttpPost httpost = new HttpPost(url);
			// 添加参数
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			if (params != null && params.keySet().size() > 0) {
				Iterator iterator = params.entrySet().iterator();
				while (iterator.hasNext()) {
					Map.Entry entry = (Entry) iterator.next();
					nvps.add(new BasicNameValuePair((String) entry.getKey(),
							(String) entry.getValue()));
				}
			}
			// 设置请求的编码格式
			httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
			// 登录一遍
			httpclient.execute(httpost);
			// 然后再第二次请求普通的url即可。
			httpost = new HttpPost(url2);
			BasicResponseHandler responseHandler = new BasicResponseHandler();
			System.out.println(httpclient.execute(httpost, responseHandler));
		} finally {
			// 关闭请求
			httpclient.getConnectionManager().shutdown();
		}
		return "";
	}

 

5.下载文件,例如mp3等等。

 

//第一个参数,网络连接;第二个参数,保存到本地文件的地址
public void getFile(String url, String fileName) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		try {
			ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
				public byte[] handleResponse(HttpResponse response)
						throws ClientProtocolException, IOException {
					HttpEntity entity = response.getEntity();
					if (entity != null) {
						return EntityUtils.toByteArray(entity);
					} else {
						return null;
					}
				}
			};

			byte[] charts = httpClient.execute(get, handler);
			FileOutputStream out = new FileOutputStream(fileName);
			out.write(charts);
			out.close();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			httpClient.getConnectionManager().shutdown();
		}
	}

 

6.创建一个多线程环境下面可用的httpClient

(原文:http://blog.csdn.net/jiaoshi0531/article/details/6459468

 

                HttpParams params = new BasicHttpParams();
		//设置允许链接的做多链接数目
		ConnManagerParams.setMaxTotalConnections(params, 200);
		//设置超时时间.
		ConnManagerParams.setTimeout(params, 10000);
		//设置每个路由的最多链接数量是20
		ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);
		//设置到指定主机的路由的最多数量是50
		HttpHost localhost = new HttpHost("127.0.0.1",80);
		connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);
		ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
		//设置链接使用的版本
		HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
		//设置链接使用的内容的编码
		HttpProtocolParams.setContentCharset(params,
				HTTP.DEFAULT_CONTENT_CHARSET);
		//是否希望可以继续使用.
		HttpProtocolParams.setUseExpectContinue(params, true);
		
		SchemeRegistry schemeRegistry = new SchemeRegistry();
		schemeRegistry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));
		schemeRegistry.register(new Scheme("https",SSLSocketFactory.getSocketFactory(),443));
		ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry);
		httpClient = new DefaultHttpClient(cm, params); 

 

7.实用的一个对象,http上下文,可以从这个对象里面取到一次请求相关的信息,例如request,response,代理主机等。

 

public static void getUrl(String url, String encoding)
			throws ClientProtocolException, IOException {
		// 设置为get取连接的方式.
		HttpGet get = new HttpGet(url);
		HttpContext localContext = new BasicHttpContext();
		// 得到返回的response.第二个参数,是上下文,很好的一个参数!
		httpclient.execute(get, localContext);

		// 从上下文中得到HttpConnection对象
		HttpConnection con = (HttpConnection) localContext
				.getAttribute(ExecutionContext.HTTP_CONNECTION);
		System.out.println("socket超时时间:" + con.getSocketTimeout());

		// 从上下文中得到HttpHost对象
		HttpHost target = (HttpHost) localContext
				.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
		System.out.println("最终请求的目标:" + target.getHostName() + ":"
				+ target.getPort());

		// 从上下文中得到代理相关信息.
		HttpHost proxy = (HttpHost) localContext
				.getAttribute(ExecutionContext.HTTP_PROXY_HOST);
		if (proxy != null)
			System.out.println("代理主机的目标:" + proxy.getHostName() + ":"
					+ proxy.getPort());

		System.out.println("是否发送完毕:"
				+ localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));

		// 从上下文中得到HttpRequest对象
		HttpRequest request = (HttpRequest) localContext
				.getAttribute(ExecutionContext.HTTP_REQUEST);
		System.out.println("请求的版本:" + request.getProtocolVersion());
		Header[] headers = request.getAllHeaders();
		System.out.println("请求的头信息: ");
		for (Header h : headers) {
			System.out.println(h.getName() + "--" + h.getValue());
		}
		System.out.println("请求的链接:" + request.getRequestLine().getUri());

		// 从上下文中得到HttpResponse对象
		HttpResponse response = (HttpResponse) localContext
				.getAttribute(ExecutionContext.HTTP_RESPONSE);
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			System.out.println("返回结果内容编码是:" + entity.getContentEncoding());
			System.out.println("返回结果内容类型是:" + entity.getContentType());
			dump(entity, encoding);
		}
	}

 输出结果大致如下:

 

socket超时时间:0
最终请求的目标:money.finance.sina.com.cn:-1
是否发送完毕:true
请求的版本:HTTP/1.1
请求的头信息: 
Host--money.finance.sina.com.cn
Connection--Keep-Alive
User-Agent--Apache-HttpClient/4.2.2 (java 1.5)
请求的链接:/corp/go.php/vFD_BalanceSheet/stockid/600031/ctrl/part/displaytype/4.phtml
返回结果内容编码是:null
返回结果内容类型是:Content-Type: text/html

 

8.设置代理

 

               //String  hostIp代理主机ip,int port  代理端口
HttpHost proxy = new HttpHost(hostIp, port);
		// 设置代理主机.
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
		proxy);

 

9.设置保持链接时间

 

//在服务端设置一个保持持久连接的特性.
		//HTTP服务器配置了会取消在一定时间内没有活动的链接,以节省系统的持久性链接资源.
		httpClient.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
			public long getKeepAliveDuration(HttpResponse response,
					HttpContext context) {
				HeaderElementIterator it = new BasicHeaderElementIterator(
						response.headerIterator(HTTP.CONN_KEEP_ALIVE));
				while (it.hasNext()) {
					HeaderElement he = it.nextElement();
					String param = he.getName();
					String value = he.getValue();
					if (value != null && param.equalsIgnoreCase("timeout")) {
						try {
							return Long.parseLong(value) * 1000;
						} catch (Exception e) {

						}
					}
				}
				HttpHost target = (HttpHost)context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
				if("www.baidu.com".equalsIgnoreCase(target.getHostName())){
					return 5*1000;
				}
				else
					return 30*1000; 
			} 
		});

 

转账注明出处:http://renjie120.iteye.com/blog/1727933

5
1
分享到:
评论
2 楼 kingdelee 2013-03-18  
太感谢了,博主能否提供一个工程源码打包下载呢,万分感谢@@!!!
1 楼 lucky16 2012-11-17  
这货前段时间也是大概看了看,
还没有实际使用呢。。

相关推荐

    httpclient4.2.2.zip

    《HttpClient 4.2.2:Java开发中的HTTP通信利器》 HttpClient是Apache软件基金会的一个开源项目,专门用于处理HTTP协议的客户端编程工具。在Java开发中,HttpClient库被广泛应用于构建网络请求,进行数据交互,它...

    httpclient 4.2.2

    HttpClient 4.2.2 版本是该库的一个重要里程碑,它提供了一系列增强和改进,使得开发者能够更加高效、稳定地进行网络通信。本文将深入探讨 HttpClient 4.2.2 的核心特性和使用方法。 一、HttpClient 4.2.2 的主要...

    httpclient-4.2.2

    总的来说,HttpClient 4.2.2 是一个强大而灵活的工具,广泛应用于各种需要与 Web 服务器进行交互的 Java 应用程序中,如爬虫、API 客户端等。其丰富的功能和强大的性能,使得开发者能够轻松地处理复杂的 HTTP 请求...

    httpclient 4.2.2以及相关jar包

    《HttpClient 4.2.2及其相关库的深度解析》 HttpClient是Apache软件基金会开发的一个Java库,专门用于执行HTTP请求。在标题提及的“httpclient 4.2.2”版本中,HttpClient提供了一个强大且灵活的工具集,允许开发者...

    httpclient-4.5.12-API文档-中文版.zip

    赠送jar包:httpclient-4.5.12.jar; 赠送原API文档:httpclient-4.5.12-javadoc.jar; 赠送源代码:httpclient-4.5.12-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.12.pom; 包含翻译后的API文档:...

    java使用HttpClient通过url下载文件到本地

    通过查看和分析这个文件,可以更深入地理解如何在实际项目中应用HttpClient下载文件。 7. **优化与安全**: - 使用连接池管理器,如`PoolingHttpClientConnectionManager`,可以复用HTTP连接,提高性能。 - 考虑...

    httpclient-4.5.13-API文档-中文版.zip

    赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...

    httpclient-4.5.13-API文档-中英对照版.zip

    赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...

    httpclient-4.2.2.jar

    httpclient-4.2.2.jar

    httpclient.jar包下载.zip

    在Java环境中,`httpclient.jar`是HttpClient库的二进制文件,通常通过Maven或Gradle等构建工具作为依赖引入项目。将`httpclient.jar`下载并添加到项目类路径中,即可使用HttpClient的功能。 总的来说,HttpClient...

    java httpclient 模拟登录

    在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站的过程,获取登录后的session信息,以便后续能够访问登录后才能看到的页面内容。以下将详细介绍如何使用Java HttpClient进行...

    httpclient-4.5.5-API文档-中文版.zip

    赠送jar包:httpclient-4.5.5.jar; 赠送原API文档:httpclient-4.5.5-javadoc.jar; 赠送源代码:httpclient-4.5.5-sources.jar; 包含翻译后的API文档:httpclient-4.5.5-javadoc-API文档-中文(简体)版.zip ...

    httpclient和RestfuL风格上传下载文件

    在Java开发中,HTTPClient和RESTful风格的接口被广泛用于实现文件的上传与下载功能。HTTPClient是一个强大的HTTP客户端库,而RESTful是一种轻量级的、基于HTTP协议的软件架构风格,常用于构建Web服务。在分布式系统...

    HttpClient实现文件下载

    ### HttpClient 实现文件下载 #### 一、简介与原理 在Java开发中,经常会遇到需要通过HTTP协议来获取网络资源的需求,例如从Web服务器下载文件。Apache HttpClient 是一个用于发送HTTP请求的Java类库,它提供了...

    httpclient-4.2.5-API文档-中文版.zip

    赠送jar包:httpclient-4.2.5.jar; 赠送原API文档:httpclient-4.2.5-javadoc.jar; 赠送源代码:httpclient-4.2.5-sources.jar; 赠送Maven依赖信息文件:httpclient-4.2.5.pom; 包含翻译后的API文档:httpclient...

    httpclient.jar包下载

    《深入解析httpclient.jar及其与code.jar的关联》 在Java开发中,HTTP通信是不可或缺的一部分,而Apache HttpClient库正是Java...理解和熟练掌握HttpClient库,将有助于提升Java应用在网络通信方面的效率和稳定性。

    httpclient-4.4.1-API文档-中文版.zip

    赠送jar包:httpclient-4.4.1.jar; 赠送原API文档:httpclient-4.4.1-javadoc.jar; 赠送源代码:httpclient-4.4.1-sources.jar; 赠送Maven依赖信息文件:httpclient-4.4.1.pom; 包含翻译后的API文档:httpclient...

    Java中访问页面的HttpClient类

    在Java编程中,访问网页内容是一项常见的任务,通常我们使用HttpClient类来实现这一功能。HttpClient是Apache HttpClient库的核心类,它提供了丰富的API用于构建复杂的HTTP客户端应用。这篇博客(原文链接:...

    httpclient.jar 文件下载

    《httpclient.jar:JAVA扩展组件的核心解析》 在Java编程领域,HTTPClient是一个不可或缺的工具,它为开发者提供了强大的HTTP客户端功能,使我们能够轻松地与Web服务器进行交互。httpclient.jar文件是这个组件的...

    java实现HttpClient异步请求资源的方法

    以下是一个使用HttpClient进行异步请求的Java示例: ```java import java.util.concurrent.CountDownLatch; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org....

Global site tag (gtag.js) - Google Analytics