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);
}
}
分享到:
相关推荐
6. **连接管理**: HttpClient 内置了连接管理器,可以控制并发连接的数量,自动检测并关闭失效连接,适应多线程应用。 7. **持久连接**:支持HTTP/1.0的KeepAlive和HTTP/1.1的持久连接,提高效率。 8. **直接访问...
HttpClient 特别强调了在多线程环境中的连接管理和性能优化,能够处理代理、SSL/TLS 安全连接、认证以及文件上传等功能。 在使用 HttpClient 之前,可能需要进行一些预备工作。例如,如果你的 JRE 版本是 1.3.* ...
这个强大的工具被广泛应用于各种场景,包括自动化测试、数据抓取、服务间通信等。...通过阅读官方文档和相关的学习笔记(如HttpClient学习笔记.doc),可以进一步深化对HttpClient的理解,掌握其高级特性和最佳实践。
体中获取内容,如 `EntityUtils.toString()` 可以将实体转换为字符串,`EntityUtils.toByteArray()` 转换为字节数组。以下是一些关于 HttpClient ...通过持续学习和实践,可以深入理解和掌握这些知识点,提升开发效率。
1、使用HttpClient发送GET请求: 2、使用HttpClient发送POST请求:和之前的GET类似 3、使用异步HttpClient发送请求,可以在github上找一些别人已经写好的代码,封装度比较高,直接拿来用。 4、多线程下载:使用...
- `HttpClient学习笔记.doc`: 可能包含了关于Apache HttpClient的使用教程,包括如何创建HTTP请求,执行GET和POST操作,以及设置请求头和处理响应等内容。 - `HTTP中Get与Post的区别.doc`: 深入解析HTTP协议中的GET...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
- **HttpClient学习笔记**:HttpClient是Apache的一个开源项目,用于执行HTTP请求。在与Tomcat交互时,例如在自动化部署或监控场景下,可能会用到HttpClient来发送HTTP请求到Tomcat的管理接口。 - **Tomcat配置文档...
`httpClient笔记.docx`可能是用户或教程作者整理的关于使用HttpClient的笔记或实战案例,可能包括一些常见问题的解决方案,比如处理重定向、处理cookies、上传下载文件、使用HTTPS等。 学习HttpClient时,除了API...
【Java学习笔记详解】 在Java的学习旅程中,基础至关重要。这份“学习笔记 十分有用 java”涵盖了J2SE(Java Standard Edition)的基础知识,旨在帮助读者深入理解这门广泛使用的编程语言。J2SE是Java的核心部分,...
lunece 学习笔记实用知识库分享知识分享 在本文中,我们将从多方面探索 Lucene 和 Solr 相关的知识点,并对其进行详细的分析和解释。 Lucene 和 Solr 的基本概念 Lucene 是一个基于 Java 的搜索引擎库,提供了...
"C#学习笔记-用小量资源即可下载"的主题聚焦于如何在C#中实现资源节省的下载策略,旨在帮助开发者在有限的计算和网络资源下进行高效的文件下载。 C#是一种面向对象的编程语言,其强大的.NET框架提供了丰富的类库,...
"Java学习笔记(javase)"这份资料主要涵盖了Java Standard Edition(Java SE)的基础知识,它是Java平台的核心,为桌面应用和服务器端应用提供了运行环境。这份笔记可能是作者在深入学习Java SE的过程中,对关键...
【Java学习笔记全程详解】 Java作为一种广泛应用于企业级开发、移动应用、大数据处理等领域的编程语言,其学习过程涵盖了许多核心概念和技术。这份"我的Java学习笔记"详细记录了作者在学习Java过程中积累的心得体会...
这套学习笔记全面覆盖了这两个平台的基础知识、核心概念以及高级特性,对于想要深入理解和掌握Mono在Android开发中的应用非常有价值。 首先,我们来了解一下Mono for Android。它是一个.NET开发环境,允许开发者...
在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何设计、实现和交互这两个关键组件。 首先,客户端是用户与系统进行交互的部分,它发送请求到服务器并接收响应。服务器端则处理这些请求...
总的来说,这篇学习笔记涵盖了Android应用中网络通信的基础知识,包括使用WebView加载网页以及借助ImageView和第三方库加载网络图片。理解并熟练掌握这些内容,对于进行Android应用开发至关重要,它能帮助开发者构建...