HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
对于某些页面的爬取有些链接使用javascript加密的话需要使用htmlunit,这个工具可以直接执行javascript
个人写的工具类,仅供参考:
package com.xyj.com.tool.util;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.security.cert.CertificateException;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
/**
* @className:HttpClientUtil.java
* @classDescription:HttpClient工具类//待完善模拟登录,cookie,证书登录
* @author:xiayingjie
* @createTime:2011-8-31
*/
public class HttpClientUtil {
public static String CHARSET_ENCODING = "UTF-8";
// private static String
// USER_AGENT="Mozilla/4.0 (compatible; MSIE 6.0; Win32)";//ie6
public static String USER_AGENT = "Mozilla/4.0 (compatible; MSIE 7.0; Win32)";// ie7
// private static String
// USER_AGENT="Mozilla/4.0 (compatible; MSIE 8.0; Win32)";//ie8
/**
* 获取DefaultHttpClient对象
*
* @param charset
* 字符编码
* @return DefaultHttpClient对象
*/
private static DefaultHttpClient getDefaultHttpClient(final String charset) {
DefaultHttpClient httpclient = new DefaultHttpClient();
// 模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
httpclient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
USER_AGENT);
httpclient.getParams().setParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
httpclient.getParams().setParameter(
CoreProtocolPNames.HTTP_CONTENT_CHARSET,
charset == null ? CHARSET_ENCODING : charset);
// 浏览器兼容性
httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY);
// 定义重试策略
httpclient.setHttpRequestRetryHandler(requestRetryHandler);
return httpclient;
}
/**
* 访问https的网站
* @param httpclient
*/
private static void enableSSL(DefaultHttpClient httpclient){
//调用ssl
try {
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[] { truseAllManager }, null);
SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme https = new Scheme("https", sf, 443);
httpclient.getConnectionManager().getSchemeRegistry()
.register(https);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 重写验证方法,取消检测ssl
*/
private static TrustManager truseAllManager = new X509TrustManager(){
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
} ;
/**
* 异常自动恢复处理, 使用HttpRequestRetryHandler接口实现请求的异常恢复
*/
private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
// 自定义的恢复策略
public boolean retryRequest(IOException exception, int executionCount,
HttpContext context) {
// 设置恢复策略,在发生异常时候将自动重试3次
if (executionCount >= 3) {
// 如果连接次数超过了最大值则停止重试
return false;
}
if (exception instanceof NoHttpResponseException) {
// 如果服务器连接失败重试
return true;
}
if (exception instanceof SSLHandshakeException) {
// 不要重试ssl连接异常
return false;
}
HttpRequest request = (HttpRequest) context
.getAttribute(ExecutionContext.HTTP_REQUEST);
boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
if (!idempotent) {
// 重试,如果请求是考虑幂等
return true;
}
return false;
}
};
/**
* 使用ResponseHandler接口处理响应,HttpClient使用ResponseHandler会自动管理连接的释放,解决了对连接的释放管理
*/
private static ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
// 自定义响应处理
public String handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity) == null ? CHARSET_ENCODING
: EntityUtils.getContentCharSet(entity);
return new String(EntityUtils.toByteArray(entity), charset);
} else {
return null;
}
}
};
/**
* 使用post方法获取相关的数据
*
* @param url
* @param paramsList
* @return
*/
public static String post(String url, List<NameValuePair> paramsList) {
return httpRequest(url, paramsList, "POST", null);
}
/**
* 使用post方法并且通过代理获取相关的数据
*
* @param url
* @param paramsList
* @param proxy
* @return
*/
public static String post(String url, List<NameValuePair> paramsList,
HttpHost proxy) {
return httpRequest(url, paramsList, "POST", proxy);
}
/**
* 使用get方法获取相关的数据
*
* @param url
* @param paramsList
* @return
*/
public static String get(String url, List<NameValuePair> paramsList) {
return httpRequest(url, paramsList, "GET", null);
}
/**
* 使用get方法并且通过代理获取相关的数据
*
* @param url
* @param paramsList
* @param proxy
* @return
*/
public static String get(String url, List<NameValuePair> paramsList,
HttpHost proxy) {
return httpRequest(url, paramsList, "GET", proxy);
}
/**
* 提交数据到服务器
*
* @param url
* @param params
* @param authenticated
* @throws IOException
* @throws ClientProtocolException
*/
public static String httpRequest(String url,
List<NameValuePair> paramsList, String method, HttpHost proxy) {
String responseStr = null;
// 判断输入的值是是否为空
if (null == url || "".equals(url)) {
return null;
}
// 创建HttpClient实例
DefaultHttpClient httpclient = getDefaultHttpClient(CHARSET_ENCODING);
//判断是否是https请求
if(url.startsWith("https")){
enableSSL(httpclient);
}
String formatParams = null;
// 将参数进行utf-8编码
if (null != paramsList && paramsList.size() > 0) {
formatParams = URLEncodedUtils.format(paramsList, CHARSET_ENCODING);
}
// 如果代理对象不为空则设置代理
if (null != proxy) {
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
proxy);
}
try {
// 如果方法为Get
if ("GET".equalsIgnoreCase(method)) {
if (formatParams != null) {
url = (url.indexOf("?")) < 0 ? (url + "?" + formatParams)
: (url.substring(0, url.indexOf("?") + 1) + formatParams);
}
HttpGet hg = new HttpGet(url);
responseStr = httpclient.execute(hg, responseHandler);
// 如果方法为Post
} else if ("POST".equalsIgnoreCase(method)) {
HttpPost hp = new HttpPost(url);
if (formatParams != null) {
StringEntity entity = new StringEntity(formatParams);
entity.setContentType("application/x-www-form-urlencoded");
hp.setEntity(entity);
}
responseStr = httpclient.execute(hp, responseHandler);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return responseStr;
}
/**
* 提交数据到服务器
*
* @param url
* @param params
* @param authenticated
* @throws IOException
* @throws ClientProtocolException
*/
public static String httpFileRequest(String url,
Map<String, String> fileMap,Map<String, String> stringMap,int type, HttpHost proxy) {
String responseStr = null;
// 判断输入的值是是否为空
if (null == url || "".equals(url)) {
return null;
}
// 创建HttpClient实例
DefaultHttpClient httpclient = getDefaultHttpClient(CHARSET_ENCODING);
//判断是否是https请求
if(url.startsWith("https")){
enableSSL(httpclient);
}
// 如果代理对象不为空则设置代理
if (null != proxy) {
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
proxy);
}
//发送文件
HttpPost hp = new HttpPost(url);
MultipartEntity multiEntity = new MultipartEntity();
try {
//type=0是本地路径,否则是网络路径
if(type==0){
for (String key : fileMap.keySet()) {
multiEntity.addPart(key, new FileBody(new File(fileMap.get(key))));
}
}else{
for (String key : fileMap.keySet()) {
multiEntity.addPart(key,new ByteArrayBody(getUrlFileBytes(fileMap.get(key)),key));
}
}
// 加入相关参数 默认编码为utf-8
for (String key : stringMap.keySet()) {
multiEntity.addPart(key, new StringBody(stringMap.get(key),Charset.forName(CHARSET_ENCODING)));
}
hp.setEntity(multiEntity);
responseStr = httpclient.execute(hp, responseHandler);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return responseStr;
}
/**
* 将相关文件和参数提交到相关服务器
* @param url
* @param fileMap
* @param StringMap
* @return
*/
public static String postFile(String url, Map<String, String> fileMap,
Map<String, String> stringMap) {
return httpFileRequest( url,fileMap,stringMap,0, null);
}
/**
* 将相关文件和参数提交到相关服务器
* @param url
* @param fileMap
* @param StringMap
* @return
*/
public static String postUrlFile(String url, Map<String, String> urlMap,
Map<String, String> stringMap) {
return httpFileRequest( url,urlMap,stringMap,1, null);
}
/**
* 获取网络文件的字节数组
*
* @param url
* @return
* @throws IOException
* @throws ClientProtocolException
* @throws ClientProtocolException
* @throws IOException
*/
public static byte[] getUrlFileBytes(String url) throws ClientProtocolException,
IOException {
byte[] bytes = null;
// 创建HttpClient实例
DefaultHttpClient httpclient = getDefaultHttpClient(CHARSET_ENCODING);
// 获取url里面的信息
HttpGet hg = new HttpGet(url);
HttpResponse hr = httpclient.execute(hg);
bytes = EntityUtils.toByteArray(hr.getEntity());
// 转换内容为字节
return bytes;
}
/**
* 获取图片的字节数组
*
* @createTime 2011-11-24
* @param url
* @return
* @throws IOException
* @throws ClientProtocolException
* @throws ClientProtocolException
* @throws IOException
*/
public static byte[] getImg(String url) throws ClientProtocolException,
IOException {
byte[] bytes = null;
// 创建HttpClient实例
DefaultHttpClient httpclient = getDefaultHttpClient(CHARSET_ENCODING);
// 获取url里面的信息
HttpGet hg = new HttpGet(url);
HttpResponse hr = httpclient.execute(hg);
bytes = EntityUtils.toByteArray(hr.getEntity());
// 转换内容为字节
return bytes;
}
public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException {
String url="http://www.baidu.com/";
String str=HttpClientUtil.get(url, null);
System.out.println(str);
}
}
分享到:
相关推荐
1. 支持HTTP/1.1和HTTP/2协议:HttpClient支持多种HTTP协议版本,包括最新的HTTP/2,这使得它能够高效地处理网络通信。 2. 请求和响应处理:HttpClient允许创建各种HTTP请求(GET、POST、PUT、DELETE等),并能解析...
2. **httpcore-4.3.2.jar**:Apache HttpCore是HttpClient的基础模块,提供了HTTP协议处理的核心组件。HttpCore主要负责网络I/O操作,如套接字连接、请求和响应的编码解码等。这个库是低级别的,专注于效率和性能,...
在Java开发中,HttpClient和Jsoup是两个非常重要的库,分别用于处理HTTP协议的客户端请求和解析HTML内容。本文将详细介绍如何将HttpClient与Jsoup整合,以便在进行网络请求时获取并解析网页数据。 HttpClient是...
它使用了 Apache HttpClient 库,这是一个强大的 Java 客户端编程工具包,用于处理 HTTP 协议。以下是对类中关键方法和概念的详细解释: 1. **HttpClientUtil 类结构**: 类中定义了一个静态的日志器 LOGGER,用于...
而Qt中的HTTP服务器和客户端功能是其网络模块的重要组成部分,能够帮助开发者构建基于HTTP协议的服务和应用。本文将深入探讨"Qt http server client"的相关知识点,并结合提供的源代码进行解析。 首先,让我们了解...
HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。它提供了一种高效、灵活且可扩展的方式来发起HTTP请求,并处理响应。在这个工具类中,我们看到包括了Post、Get、Put和Delete四...
**httpcore-4.2.4.jar** 是HTTP Core模块,它是HttpClient的基础,提供了对HTTP协议核心部分的支持。这个库包括了基本的HTTP连接管理、请求和响应的处理、以及对HTTP/1.0和HTTP/1.1协议的支持。它包含了HTTP连接的...
HttpClient是Apache软件基金会的一个开源Java库,主要用于执行HTTP请求,为开发者提供了强大的功能来构建复杂的HTTP客户端应用。这个jar包,"commons-httpclient-3.1",是HttpClient的一个版本,发布于2006年,是...
* HttpClient支持基本的HTTP协议,还支持HTTP-aware客户端程序,如web浏览器,Webservice客户端,以及利用或拓展HTTP协议的分布式系统。 HttpClient的优点 * 高度灵活和强大 * 提供了一个功能丰富的HTTP客户端库 *...
HttpClient是一个功能强大的客户端编程工具包,广泛应用于需要与Web服务器交互的应用场景,如网页抓取、API调用等。 首先,我们来看`httpclient-4.3.1.jar`。这是Apache HttpClient的核心库,提供了一个灵活且高度...
其次,`httpcore.jar`是HttpClient的基础组件,提供了HTTP协议的基本操作,如连接管理、请求和响应处理。它是HttpClient库的核心部分,包含了HTTP连接管理器、请求和响应模型、传输编码等低级API,为HttpClient提供...
在深入了解HTTPClient之前,我们先来理解一下HTTP协议的基本概念。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,它定义了客户端(如浏览器)和服务器之间交换数据的格式和规则。 HTTPClient库提供了...
HttpClient是Apache软件基金会下的一个开源项目,主要提供了一组与HTTP协议交互的API,使得开发者...这个版本的HttpClient为Java开发者提供了强大且灵活的HTTP客户端工具,广泛应用于各种系统集成和Web服务调用场景。
HTTP协议作为互联网的核心通信标准之一,在现代网络服务及物联网设备中扮演着至关重要的角色。随着技术的发展,越来越多的应用和服务依赖于HTTP协议来实现数据交换。Java 开发者在进行网络编程时,通常会遇到需要与...
在IT行业中,HttpClient是Apache软件基金会的一个开源项目,它提供了一种强大的、高度可定制的HTTP客户端API,用于处理HTTP协议。HttpClient库广泛应用于构建Java应用程序,尤其是那些需要与Web服务进行交互的程序。...
HttpClient是Apache软件基金会下的一个开源项目,主要用于处理HTTP协议的客户端编程。HttpClient 4.0是其一个重要的版本,为开发者提供了强大的HTTP通信功能,广泛应用于Java应用中。在本篇文章中,我们将深入探讨...
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache...
HTTPClient和HTTPCore是Apache软件基金会的两个重要项目,它们在Java编程中广泛用于实现HTTP协议的客户端功能。本文将详细介绍这两个库的核心概念、功能以及它们在实际开发中的应用。 HTTPClient是一个高度可定制的...
HTTPClient-4.1.3.jar是Apache HttpClient的一个版本,它提供了一个功能丰富的客户端HTTP协议实现。HttpClient支持各种HTTP方法如GET、POST、PUT等,还包含了处理重定向、Cookie管理、连接池管理、身份认证等多种...
HTTPClient 4.5是Apache HttpClient项目的最新稳定版本,它提供了全面的HTTP协议支持,包括标准方法(GET、POST等)以及非标准方法。这个库设计灵活,性能优秀,且易于集成到各种项目中。`httpclient-4.5.jar`包含了...