`
i2534
  • 浏览: 182491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

httpclient4的封装

    博客分类:
  • util
 
阅读更多

没什么特别的,自己封装着用的.

package cpcns.office.client.http;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.mime.HttpMultipartMode;
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.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * http模拟器
 * 
 * @author lan
 * 
 */
public class HttpInvoker {

	private static class Holder {
		private static HttpInvoker instance = new HttpInvoker();
	}

	private static Log log = LogFactory.getLog(HttpInvoker.class);

	private HttpClient client;// 客户端
	private String host;// 主机地址
	private ResponseHandler<String> handler;// 应答处理
	private boolean wrap;// 是否进行Agent伪装

	private HttpInvoker() {
		handler = new BasicResponseHandler();

		ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
		cm.setMaxTotal(10);
		client = new DefaultHttpClient(cm);

	}

	/**
	 * 获取模拟器实例
	 * 
	 * @return
	 */
	public static HttpInvoker getInstance() {
		return Holder.instance;
	}

	/**
	 * 设置基本路径,如http://localhost:8080/report
	 * 
	 * @param host
	 */
	public HttpInvoker setHost(String host) {
		if (!host.endsWith("/")) {
			host += "/";
		}
		this.host = host;
		return this;
	}

	/**
	 * 进行User-Agent伪装
	 */
	public HttpInvoker setWrap(boolean wrap) {
		this.wrap = wrap;
		return this;
	}

	/**
	 * 使用安全套接字连接
	 * 
	 * @return
	 */
	public HttpInvoker setSSL() {
		try {
			SSLContext ssc = SSLContext.getInstance("TLS");
			ssc.init(null, new TrustManager[] { new X509TrustManager() {

				@Override
				public void checkClientTrusted(X509Certificate[] arg0,
						String arg1) throws CertificateException {
				}

				@Override
				public void checkServerTrusted(X509Certificate[] arg0,
						String arg1) throws CertificateException {
				}

				@Override
				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}

			} }, new SecureRandom());
			SSLSocketFactory ssf = new SSLSocketFactory(ssc);
			Scheme sch = new Scheme("https", 443, ssf);
			client.getConnectionManager().getSchemeRegistry().register(sch);
		} catch (KeyManagementException e) {
			log.error(e.getMessage(), e);
		} catch (NoSuchAlgorithmException e) {
			log.error(e.getMessage(), e);
		}
		return this;
	}

	/**
	 * 请求地址和host拼接成完整url
	 * 
	 * @param action
	 * @return
	 */
	private String makeURL(String action) {
		if (action == null) {
			action = "";
		}
		if (action.startsWith("/")) {
			action = action.substring(1);
		}
		return (this.host == null ? "" : this.host) + action;
	}

	/**
	 * 伪装成FF8
	 * 
	 * @param request
	 */
	private void agent(HttpRequestBase request) {
		request.setHeader(
				"Accept",
				"text/html,application/xhtml+xml,application/xml,image/png,image/*;q=0.8,*/*;q=0.5");
		request.setHeader("Accept-Language", "zh-cn,zh;q=0.5");
		request.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0");
		request.setHeader("Accept-Encoding", "gzip, deflate");
		request.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
		request.setHeader("Connection", "Keep-Alive");
	}

	/**
	 * 模拟get操作
	 * 
	 * @param action
	 *            请求地址,如果设置了host,则只需要action即可
	 * @return server返回结果
	 */
	public String get(String action) {
		HttpResponse response = doGet(action);
		if (response == null) {
			return null;
		}
		try {
			return handler.handleResponse(response);
		} catch (HttpResponseException e) {
			log.error(e.getMessage(), e);
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
		return null;
	}

	/**
	 * 模拟get
	 * 
	 * @param action
	 * @return
	 */
	private HttpResponse doGet(String action) {
		HttpGet get = new HttpGet(makeURL(action));
		if (wrap) {
			agent(get);
		}
		try {
			return client.execute(get);
		} catch (ClientProtocolException e) {
			log.error(e.getMessage(), e);
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
		return null;
	}

	/**
	 * 模拟post操作
	 * 
	 * @param action
	 *            请求地址,如果设置了host,则只需要action即可
	 * @param params
	 *            post的参数,允许为null
	 * @return server返回结果
	 */
	public String post(String action, Map<String, String> params) {
		List<NameValuePair> pairs = new ArrayList<NameValuePair>();
		if (params != null && !params.isEmpty()) {
			for (Map.Entry<String, String> entry : params.entrySet()) {
				NameValuePair nvp = new BasicNameValuePair(entry.getKey(),
						entry.getValue());
				pairs.add(nvp);
			}
		}
		try {
			return doPost(action, new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e) {
			log.error(e.getMessage(), e);
		}
		return null;
	}

	/**
	 * 模拟post
	 * 
	 * @param action
	 * @param entity
	 * @return
	 */
	private String doPost(String action, HttpEntity entity) {
		HttpPost post = new HttpPost(makeURL(action));
		if (wrap) {
			agent(post);
		}
		try {
			post.setEntity(entity);
			return client.execute(post, new BasicResponseHandler());
		} catch (ClientProtocolException e) {
			log.error(e.getMessage(), e);
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
		return null;
	}

	/**
	 * 上传文件操作
	 * 
	 * @param action
	 *            请求地址,如果设置了host,则只需要action即可
	 * @param params
	 *            post的参数,允许为null.value只接受String,InputStream,byte[]和File.<b>
	 *            InputStream请自行关闭.</b>
	 * @return server返回的结果
	 */
	public String upload(String action, Map<String, Object> params) {
		MultipartEntity entity = new MultipartEntity(
				HttpMultipartMode.BROWSER_COMPATIBLE);
		Charset utf8 = Charset.forName("UTF-8");
		if (params != null && !params.isEmpty()) {
			for (Map.Entry<String, Object> entry : params.entrySet()) {
				String name = entry.getKey();
				Object value = entry.getValue();
				if (value instanceof String) {
					try {
						entity.addPart(name, new StringBody((String) value,
								utf8));
					} catch (UnsupportedEncodingException e) {
						log.error(e.getMessage(), e);
					}
				} else if (value instanceof File) {
					entity.addPart(name, new FileBody((File) value));
				} else if (value instanceof InputStream) {
					entity.addPart(name, new InputStreamBody(
							(InputStream) value, name));
				} else if (value instanceof byte[]) {
					entity.addPart(name,
							new ByteArrayBody((byte[]) value, name));
				}

			}
		}

		return doPost(action, entity);
	}

	/**
	 * 下载文件,文件将保存到系统临时文件夹
	 * 
	 * @param action
	 *            get地址
	 * @param suffix
	 *            文件后缀,为null则默认为".tmp"文件
	 * @param callback
	 *            下载进度的回调,允许为null
	 * @return 文件或者null
	 */
	public File download(String action, String suffix,
			final DownloadCallback callback) {
		HttpResponse response = doGet(action);
		if (response == null) {
			return null;
		}

		HttpEntity entity = response.getEntity();
		if (entity == null) {
			return null;
		}
		if (suffix != null && !suffix.startsWith(".")) {
			suffix = "." + suffix;
		}

		File f = null;
		InputStream is = null;
		BufferedOutputStream bos = null;
		try {
			is = entity.getContent();
			f = File.createTempFile(String.valueOf(System.currentTimeMillis()),
					suffix);
			final long length = entity.getContentLength();
			log.info("开始下载:" + action + ",长度:" + length + " 到文件:"
					+ f.getAbsolutePath());
			bos = new BufferedOutputStream(new FileOutputStream(f));
			byte[] b = new byte[1024 * 5];
			int l = -1;

			final AtomicLong count = new AtomicLong(0);
			Thread caller = null;

			if (callback != null) {
				caller = new Thread() {
					@Override
					public void run() {
						long last = System.currentTimeMillis();
						for (;;) {
							try {
								Thread.sleep(callback.interval());
								long now = System.currentTimeMillis();
								call(count.get(), now - last);
								last = now;
							} catch (InterruptedException e) {
								break;
							}
						}
						call(count.get(), System.currentTimeMillis() - last);
					}

					private void call(long count, long gap) {
						CallbackEvent event = new CallbackEvent(length, count,
								gap);
						callback.call(event);
					}
				};
				caller.start();
			}
			while ((l = is.read(b)) != -1) {
				bos.write(b, 0, l);
				count.addAndGet(l);
			}
			if (caller != null) {
				caller.interrupt();
			}
			log.info("下载完毕.");
			bos.flush();
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		} finally {
			try {
				if (is != null) {
					is.close();
				}
			} catch (Exception e) {
			}
			try {
				if (bos != null) {
					bos.close();
				}
			} catch (Exception e) {
			}
		}
		return f;
	}

	/**
	 * 断开所有连接
	 */
	public void destroy() {
		if (client != null) {
			client.getConnectionManager().shutdown();
		}
	}
}

 下载回调接口

package cpcns.office.client.http;

/**
 * 下载回调接口
 * 
 * @author lan
 * 
 */
public interface DownloadCallback {

	/**
	 * 回调方法
	 * 
	 * @param event
	 */
	public void call(CallbackEvent event);

	/**
	 * 回调间隔,单位为毫秒
	 * 
	 * @return
	 */
	public int interval();

}

 回调事件类

package cpcns.office.client.http;

/**
 * 下载回调事件
 * 
 * @author lan
 * 
 */
public class CallbackEvent {

	/**
	 * 文件大小,有可能是-1
	 */
	private long total;
	/**
	 * 当前已获得大小
	 */
	private long current;
	/**
	 * 距离上次回调的时间间隔,单位为毫秒
	 */
	private long realInterval;

	public CallbackEvent(long total, long current, long realInterval) {
		this.total = total;
		this.current = current;
		this.realInterval = realInterval;
	}

	public long getTotal() {
		return total;
	}

	public long getCurrent() {
		return current;
	}

	public long getRealInterval() {
		return realInterval;
	}

}

 

 

使用的jar包


 

测试类

package test;

import java.awt.HeadlessException;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

import cpcns.office.client.http.HttpInvoker;

public class Piao {

	/**
	 * @param args
	 * @throws IOException
	 * @throws HeadlessException
	 */
	public static void main(String[] args) throws HeadlessException,
			IOException {
		HttpInvoker invoker = HttpInvoker.getInstance();
		invoker.setHost("https://dynamic.12306.cn/");
		invoker.setWrap(true).setSSL();
		File f = invoker.download(
				"otsweb/passCodeAction.do?rand=lrand&" + Math.random(), "jpg",
				null);
		String code = JOptionPane
				.showInputDialog(new ImageIcon(ImageIO.read(f)));
		System.out.println(code);
		Map<String, String> params = new HashMap<String, String>();
		params.put("loginUser.user_name", "name");
		params.put("user.password", "123456");
		params.put("randCode", code);
		String result = invoker.post("otsweb/loginAction.do?method=login",
				params);
		System.out.println(result);
		// invoker.destroy();
	}
}
 

 

  • 大小: 11.9 KB
1
0
分享到:
评论
1 楼 befairy 2012-04-12  
这么好的东西。。。收之来慢慢研究。。

相关推荐

    httpclient4 封装

    在这个“httpclient4 封装”中,我们将探讨HttpClient 4.2版本的使用,以及如何将它封装到自己的项目中。 HttpClient 4.2是Apache HttpClient系列的一个稳定版本,它支持HTTP/1.1和部分HTTP/2协议,提供了对HTTPS、...

    httpclient4.3 封装工具类

    HttpClient 4.3封装工具类支持配置HTTP代理或SOCKS代理,包括设置代理的主机名、端口号,以及代理认证等。这样,即使在需要代理的网络环境中,也能正常发起HTTP请求。 2. **多线程问题**:在处理大量并发请求时,...

    HTTPClient 的一个封装

    4. **执行请求**:调用HttpClient的`execute`方法发送请求。 5. **处理响应**:获取响应状态码、响应体、头部信息等,并进行错误检查。 6. **关闭资源**:确保在完成请求后关闭连接,避免资源泄露。 在封装过程中,...

    HttpClient 4.5 封装的工具类 HttpUtil 可用于爬虫和模拟登陆

    基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...

    对于C#(HttpClient)方式网络请求的封装

    标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...

    httpclient4.3 封装工具类.zip

    4. **线程安全**:HttpClient 4.3不是线程安全的,所以在多线程环境中,通常每个线程都应有自己的HttpClient实例或使用连接池来管理。 5. **性能优化**: - **连接池**:通过配置连接池大小,可以提高并发性能,...

    HttpClient重新封装的HttpClient类

    本篇文章将深入探讨重新封装的HttpClient类,以及如何利用它进行高效且灵活的网络请求。 首先,我们来看一下`HttpClient`类的基本用法。原生的`HttpClient`类提供了发送GET、POST等不同HTTP方法请求的能力。例如,...

    httpclient简化封装Starget.Http

    本篇文章将详细讲解基于HttpClient的简化封装Starget.Http,以及如何利用它更方便地调用WebAPI接口,并通过Attribute控制模型序列化的位置。 首先,HttpClient虽然强大且功能齐全,但其基础使用往往需要编写大量的...

    HttpClient封装工具

    在Spring框架中,我们可以将HttpClient进行封装,以便更好地利用其功能并整合到Spring的应用上下文中。下面将详细介绍如何使用Spring与HttpClient结合实现Http和Https请求。 1. **HttpClient介绍** HttpClient是一...

    httpclient封装

    封装了httpclient的get请求和post请求,包括传参数和和不传参数,以及请求头信息的设定。

    webUtils-安卓对HttpClient的简单封装

    自己对HttpClient的简单封装,目前只封装了post方式的请求

    HttpClient工具类封装.docx

    【HttpClient工具类封装】 在Java开发中,Apache HttpClient是一个强大的HTTP客户端库,常用于执行HTTP请求,如GET、POST、PUT和DELETE等。这个工具类是基于HttpClient 4.5.12版本进行封装,目的是简化HTTP操作并...

    HttpClient 4文件上传

    ### HttpClient 4 文件上传知识点详解 #### 一、概述 在Java开发中,经常会遇到需要通过HTTP协议上传文件的需求。Apache HttpClient是一个强大的客户端HTTP组件,它不仅支持HTTP协议,还能处理HTTPS请求,并提供了...

    httpclient模拟post请求json封装表单数据的实现方法

    在这个场景中,我们关注的是如何使用 HTTPClient 发送一个 JSON 格式的 POST 请求并封装表单数据。下面将详细介绍这个过程。 首先,我们需要创建一个 `HttpPost` 对象,并指定目标 URL。在给出的代码中,`url` 参数...

    HttpClient4模拟登录回贴

    HttpClient4可以通过HttpPost类实现这一操作,将这些数据封装成NameValuePair或HttpEntity对象,然后添加到请求中。 博客中可能还会讨论HttpClient4的一些高级特性,如重试策略、连接池管理和超时设置。HttpClient4...

    php中http请求封装HttpClient精华中的经典代码

    首先,HttpClient的封装通常包括以下几个核心功能: 1. **初始化设置**:创建HttpClient对象时,可能需要设置基础URL、超时时间、重试次数等参数。 2. **HTTP方法支持**:包括GET、POST、PUT、DELETE等多种HTTP请求...

    javaeye api [java httpclient版] 简单封装

    通过这个简单的封装,JavaEyeClient 使得开发者在使用 HttpClient 进行网络请求时,可以避免很多底层的细节,更专注于业务逻辑,提高了开发效率和代码的可读性。如果你对具体的使用方法感兴趣,可以参考提供的博文...

    HttpClientHelper 工具类

    HttpClientHelper 对这个类进行了封装,使得开发者无需直接与HttpClient接口打交道,而是通过更简洁、易用的方法调用来实现网络通信。这提高了代码的可读性和可维护性。 单例模式是软件设计模式的一种,确保一个类...

    封装采用HttpClient发送HTTP请求的方法

    封装了一些采用HttpClient发送HTTP请求的方法;httpPOST2方法HttpUtil.post(url, params)需引入jar &lt;dependency&gt; &lt;groupId&gt;...

    (最新)HttpClient4模拟登录腾讯微博

    这篇最新的文章“HttpClient4模拟登录腾讯微博”探讨了如何利用HttpClient4实现对腾讯微博的模拟登录,这在自动化测试、数据抓取等场景中非常实用。 HttpClient4库提供了丰富的API,可以定制化地构造HTTP请求,包括...

Global site tag (gtag.js) - Google Analytics