`
wxlgzxx_1988
  • 浏览: 67853 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HttpClient学习笔记

阅读更多

     HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它很好的支持了 HTTP 协议。Commons-httpclient项目(现在已被移植到jMeter项目中)就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决。

 

一,准备环境和jar包

  使用前先到apache官网上下载jar包,网址:http://jmeter.apache.org/download_jmeter.cgi,在项目中导入以下jar包:commons-codec-1.6.jar,commons-httpclient-3.1.jar,commons-logging-1.1.1.jar

 

二,使用步骤

使用 HttpClient 需要以下6个步骤:

1. 创建 HttpClient 的实例

    HttpClient  httpClient = new HttpClient(); 

 

2. 创建某种连接方法(DeleteMethod,EntityEnclosingMethod,ExpectContinueMethod,GetMethod,HeadMethod,MultipartPostMethod,OptionsMethod,PostMethod,PutMethod,TraceMethod)的一个实例,一般可用要目标URL为参数。

    例如:get方式:HttpMethod getMethod=new GetMethod(url);

       post方式:HttpMethod postMethod = new PostMethod(url);

 

3. 调用第一步中创建好的实例的executeMethod方法来执行第二步中创建好的 method 实例.

   httpClient.executeMethod(postMethod);

 

4. 读 response 信息

 

5. 释放连接。(无论执行方法是否成功,都必须释放连接)

   method.releaseConnection();

 

6.对得到的内容进行处理

package com.wxl.test;

import java.io.IOException;
import java.util.Map;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.params.HttpMethodParams;

/**
 * @author wangxl
 * 
 */
public class HttpClientCenter {

	private static HttpClient httpClient = null;
	// 构造HttpClient的实例
	private static HttpClientCenter instance = null;

	private HttpClientCenter() {
		httpClient = new HttpClient();
	}

	public static HttpClientCenter getInstance() {
		if (instance == null) {
			return new HttpClientCenter();
		}
		return instance;
	}

	/**
	 * GET请求	
	* @param url
	 */
	public void getMethod(String url) {
		GetMethod getMethod = null;
		try {
			URI uri = new URI(url, true);
			getMethod = new GetMethod(url);// 创建GET方法的实例,可同时对请求的头,等等,做相应的设置
			/** 设置代理 */
			HostConfiguration hostConfiguration = new HostConfiguration();
			hostConfiguration.setHost(uri);
			// hostConfiguration.setProxy("127.0.0.1", 8080);// 配置代理IP和端口
			httpClient.setHostConfiguration(hostConfiguration);

			// 使用系统提供的默认的恢复策略
			getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
					new DefaultHttpMethodRetryHandler());

			HttpConnectionManagerParams managerParams = httpClient
					.getHttpConnectionManager().getParams();
			managerParams.setConnectionTimeout(30000); // 设置连接超时时间(单位毫秒)
			managerParams.setSoTimeout(120000); // 设置读数据超时时间(单位毫秒)
			int statusCode = httpClient.executeMethod(getMethod);// 执行getMethod,返回响应码
			if (statusCode != HttpStatus.SC_OK) {
				System.err.println("Method failed: "
						+ getMethod.getStatusLine());
			}
			String charSet = getMethod.getResponseCharSet(); // 响应的字符编码
			byte[] responseBody = getMethod.getResponseBody(); // 读取内容

			System.out.println("responseCode:\r\n" + statusCode);
			System.out.println("charSet:\r\n" + charSet);
			System.out.println("response:\r\n"
					+ new String(responseBody, charSet));
			// 得到相应头信息
			Header headers[] = getMethod.getResponseHeaders();
			System.out.println("headers:");
			for (int i = 0; i < headers.length; i++) {
				System.out.println(headers[i]);
			}
			/**
			 * Date: Thu, 02 Feb 2012 07:15:54 GMT
			 * 
			 * Content-Type: text/vnd.wap.wml;charset=UTF-8
			 * 
			 * Transfer-Encoding: chunked
			 * 
			 * Connection: keep-alive
			 */

		} catch (HttpException e) {
			e.printStackTrace();// 发生致命的异常,可能是协议不对或者返回的内容有问题
		} catch (IOException e) {
			e.printStackTrace();// 发生网络异常
		} finally {
			getMethod.releaseConnection();// 释放连接
		}
	}

	public void postMethod(String url, Map<Object, Object> datas) {
		PostMethod postMethod = new PostMethod(url);
		/** 设置代理---同上GET方法 */
		int params = datas.size();
		NameValuePair[] data = new NameValuePair[params];
		int i = 0;
		for (Object obj : datas.keySet()) {
			data[i++] = new NameValuePair((String) obj, (String) datas.get(obj));
		}
		// NameValuePair[] data = {new NameValuePair("id", "youUserName"), new
		// NameValuePair("passwd", "yourPwd") };//填入各个表单域的值
		// postMethod.setRequestEntity(new
		// StringRequestEntity("createRequestXML()",
		// "text/xml", "GBK")); 可使用XML格式传输post参数
		postMethod.setRequestBody(data);// 将表单的值放入postMethod中
		try {
			HttpConnectionManagerParams managerParams = httpClient
					.getHttpConnectionManager().getParams();
			managerParams.setConnectionTimeout(30000); // 设置连接超时时间(单位毫秒)
			managerParams.setSoTimeout(120000); // 设置读数据超时时间(单位毫秒)
			int statusCode = httpClient.executeMethod(postMethod);// 执行postMethod
			// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
			if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
					|| statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {// 301或者302
				Header locationHeader = postMethod
						.getResponseHeader("location");// 从头中取出转向的地址
				String location = null;
				if (locationHeader != null) {
					location = locationHeader.getValue();
					System.out
							.println("The page was redirected to:" + location);
				} else {
					System.err.println("Location field value is null.");
				}
				return;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void cookieSet() {
		httpClient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);// RFC_2109是支持较普遍的一个,还有其他cookie协议
		HttpState initialState = new HttpState();
		Cookie cookie = new Cookie();
		cookie.setDomain("www.balblabla.com");
		cookie.setPath("/");
		cookie.setName("多情环");
		cookie.setValue("多情即无情");
		initialState.addCookie(cookie);
		httpClient.setState(initialState);
	}

	public void cookieGet() {
		Cookie[] cookies = httpClient.getState().getCookies();
		System.out.println("Present cookies: ");
		for (int i = 0; i < cookies.length; i++) {
			System.out.println(" - " + cookies[i].toExternalForm());
			System.out.println(" - domain=" + cookies[i].getDomain());
			System.out.println(" - path=" + cookies[i].getPath());
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HttpClientCenter hcc = HttpClientCenter.getInstance();
		String url = "http://www.500wan.com/";
		url = "http://wap.500wan.com";
		hcc.getMethod(url);
		
		// Map<Object, Object> datas = new HashMap<Object, Object>();
		// datas.put("id", "1001");
		// datas.put("pass", "123456");
		// hcc.postMethod(url, datas);

	}

}

 

分享到:
评论

相关推荐

    HttpClient学习笔记参考.pdf

    6. **连接管理**: HttpClient 内置了连接管理器,可以控制并发连接的数量,自动检测并关闭失效连接,适应多线程应用。 7. **持久连接**:支持HTTP/1.0的KeepAlive和HTTP/1.1的持久连接,提高效率。 8. **直接访问...

    HttpClient 学习笔记

    HttpClient 特别强调了在多线程环境中的连接管理和性能优化,能够处理代理、SSL/TLS 安全连接、认证以及文件上传等功能。 在使用 HttpClient 之前,可能需要进行一些预备工作。例如,如果你的 JRE 版本是 1.3.* ...

    http client

    这个强大的工具被广泛应用于各种场景,包括自动化测试、数据抓取、服务间通信等。...通过阅读官方文档和相关的学习笔记(如HttpClient学习笔记.doc),可以进一步深化对HttpClient的理解,掌握其高级特性和最佳实践。

    httpclient4.5笔记,常用知识点,从零开始也能看懂(持续更新)

    体中获取内容,如 `EntityUtils.toString()` 可以将实体转换为字符串,`EntityUtils.toByteArray()` 转换为字节数组。以下是一些关于 HttpClient ...通过持续学习和实践,可以深入理解和掌握这些知识点,提升开发效率。

    android 学习笔记6-HttpClient 多线程下载 断点续传 进度条 源码关联

    1、使用HttpClient发送GET请求: 2、使用HttpClient发送POST请求:和之前的GET类似 3、使用异步HttpClient发送请求,可以在github上找一些别人已经写好的代码,封装度比较高,直接拿来用。 4、多线程下载:使用...

    threadLocal

    - `HttpClient学习笔记.doc`: 可能包含了关于Apache HttpClient的使用教程,包括如何创建HTTP请求,执行GET和POST操作,以及设置请求头和处理响应等内容。 - `HTTP中Get与Post的区别.doc`: 深入解析HTTP协议中的GET...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    tomcat6.0 数据源配置

    - **HttpClient学习笔记**:HttpClient是Apache的一个开源项目,用于执行HTTP请求。在与Tomcat交互时,例如在自动化部署或监控场景下,可能会用到HttpClient来发送HTTP请求到Tomcat的管理接口。 - **Tomcat配置文档...

    httpclient4中文API和使用

    `httpClient笔记.docx`可能是用户或教程作者整理的关于使用HttpClient的笔记或实战案例,可能包括一些常见问题的解决方案,比如处理重定向、处理cookies、上传下载文件、使用HTTPS等。 学习HttpClient时,除了API...

    学习笔记 十分有用 java

    【Java学习笔记详解】 在Java的学习旅程中,基础至关重要。这份“学习笔记 十分有用 java”涵盖了J2SE(Java Standard Edition)的基础知识,旨在帮助读者深入理解这门广泛使用的编程语言。J2SE是Java的核心部分,...

    lunece 学习笔记实用知识库分享知识分享

    lunece 学习笔记实用知识库分享知识分享 在本文中,我们将从多方面探索 Lucene 和 Solr 相关的知识点,并对其进行详细的分析和解释。 Lucene 和 Solr 的基本概念 Lucene 是一个基于 Java 的搜索引擎库,提供了...

    C#学习笔记-用小量资源即可下载

    "C#学习笔记-用小量资源即可下载"的主题聚焦于如何在C#中实现资源节省的下载策略,旨在帮助开发者在有限的计算和网络资源下进行高效的文件下载。 C#是一种面向对象的编程语言,其强大的.NET框架提供了丰富的类库,...

    Java学习笔记(javase)

    "Java学习笔记(javase)"这份资料主要涵盖了Java Standard Edition(Java SE)的基础知识,它是Java平台的核心,为桌面应用和服务器端应用提供了运行环境。这份笔记可能是作者在深入学习Java SE的过程中,对关键...

    java学习笔记,全程

    【Java学习笔记全程详解】 Java作为一种广泛应用于企业级开发、移动应用、大数据处理等领域的编程语言,其学习过程涵盖了许多核心概念和技术。这份"我的Java学习笔记"详细记录了作者在学习Java过程中积累的心得体会...

    Mono for Android和MonoDroid学习笔记全套

    这套学习笔记全面覆盖了这两个平台的基础知识、核心概念以及高级特性,对于想要深入理解和掌握Mono在Android开发中的应用非常有价值。 首先,我们来了解一下Mono for Android。它是一个.NET开发环境,允许开发者...

    Java 客户端服务器程序 学习笔记

    在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何设计、实现和交互这两个关键组件。 首先,客户端是用户与系统进行交互的部分,它发送请求到服务器并接收响应。服务器端则处理这些请求...

    Android学习笔记——Http通信 源码

    总的来说,这篇学习笔记涵盖了Android应用中网络通信的基础知识,包括使用WebView加载网页以及借助ImageView和第三方库加载网络图片。理解并熟练掌握这些内容,对于进行Android应用开发至关重要,它能帮助开发者构建...

Global site tag (gtag.js) - Google Analytics