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

在网上看了一段代码 觉得好有摘下来 主要是中文的处理上有用

阅读更多

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.SSLHandshakeException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
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.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import com.anal.UtilComm;

public class HttpClientFactory {
	
	private static final String CHARSET_GBK = "GBK";
	
	/**
	 *  异常自动恢复处理
	 *  使用HttpRequestRetryHandler接口实现请求的异常恢复
	 */
	private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
		// 自定义的恢复策略
		public synchronized 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 synchronized String handleResponse(HttpResponse response)	throws ClientProtocolException, IOException {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				String charset = EntityUtils.getContentCharSet(entity) == null ? CHARSET_GBK : EntityUtils.getContentCharSet(entity);
				return new String(EntityUtils.toByteArray(entity), charset);
			} else {
				return null;
			}
		}
	};
	
	/**
	* 获取DefaultHttpClient实例
	* 
	* @param charset
	* 参数编码集, 可空
	* @return DefaultHttpClient 对象
	*/
	public static DefaultHttpClient getDefaultHttpClient(final String charset){
		DefaultHttpClient httpclient = new DefaultHttpClient();
		ArrayList headers = new ArrayList();
		headers.add(new BasicHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"));
		headers.add(new BasicHeader("Accept-Language", "zh-cn,en-us,zh-tw,en-gb,en;"));
		headers.add(new BasicHeader("Accept-Charset","gbk,gb2312,utf-8,BIG5,ISO-8859-1;"));
		headers.add(new BasicHeader("Connection","Close"));
		headers.add(new BasicHeader("Cache-Control","no-cache"));
		headers.add(new BasicHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; CIBA)"));
		httpclient.getParams().setParameter("http.default-headers", headers);
		
		//设置http头信息
		httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
		//模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
		httpclient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, charset == null ? HTTP.UTF_8 : charset);
		httpclient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,30000);
		httpclient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
		httpclient.setHttpRequestRetryHandler(requestRetryHandler);
		return httpclient;
	}
	
	/**
	 * get方式提交抓取网页
	 * 
	 * @param url
	 * @param charset
	 * @throws IOException
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public static String httpGet(HttpClient httpClient, String url,
			String charset) throws ClientProtocolException, IOException {
		HttpGet httpget = new HttpGet(url);
		String content = null;
		// 发送请求,得到响应
		HttpResponse response = httpClient.execute(httpget);
		HttpEntity entity = response.getEntity();
		if (entity != null && HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
			charset = EntityUtils.getContentCharSet(entity) == null ? 
					CHARSET_GBK : EntityUtils.getContentCharSet(entity);
			content = UtilComm.getString(entity.getContent(),charset);
		}

		abortRequest(httpget);
		return content;
		
	}

	/**
	 * post方式提交抓取网页
	 * 
	 * @param url
	 * @param charset
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	public static String httpPost(HttpClient httpClient, String url,
			String charset) throws ClientProtocolException, IOException {
		HttpPost httppost = new HttpPost(url);
		// 得到提交的POST值
		List<NameValuePair> nvpsList = UtilComm.getNameValuePairs(url);
		httppost.setEntity(new UrlEncodedFormEntity(nvpsList, charset));
		// 得到返回值
		String content = null;
		HttpResponse response = httpClient.execute(httppost);
		HttpEntity entity = response.getEntity();
		if (entity != null && HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
			charset = EntityUtils.getContentCharSet(entity) == null ? 
					CHARSET_GBK : EntityUtils.getContentCharSet(entity);
			content = UtilComm.getString(entity.getContent(),charset);
		}
		
		abortRequest(httppost);
		return content;
	}
	
	/**
	* 释放HttpClient连接
	* 
	* @param hrb
	* 请求对象
	* @param httpclient
	* 			client对象
	*/
	public static void abortRequest(final HttpRequestBase hrb){
		if (hrb != null && hrb.isAborted()) {
			hrb.abort();
		}
	}
	
	public static void shutdown(final HttpClient httpclient) {
		if (httpclient != null) {
			httpclient.getConnectionManager().shutdown();
		}
	}
}
 
分享到:
评论

相关推荐

    【数据库技术】MySQL MCP多通道协议实现与应用:高效数据库连接池管理及负载均衡使用案例分析

    内容概要:本文档介绍了MySQL MCP(MySQL Multi-Channel Protocol)的基本使用方法和常见案例。MySQL MCP提供高效的数据库连接池和负载均衡功能,支持读写分离、事务处理、批量操作以及连接池监控等功能。文档详细描述了如何安装和配置MySQL MCP,包括创建配置文件`mcp_config.json`,并通过多个使用案例展示了其功能。案例包括连接数据库、实现读写分离、处理事务、执行批量插入和监控连接池状态。此外,还介绍了高级用法如自定义负载均衡策略和故障转移处理,以及性能优化建议,如合理设置连接池大小、监控连接使用情况、设置合理的超时时间和使用预编译语句。; 适合人群:具备一定数据库操作基础,尤其是对MySQL有一定了解的研发人员和数据库管理员。; 使用场景及目标:①需要高效管理数据库连接的应用系统;②实现读写分离,提高数据库读取性能;③确保事务处理的完整性和一致性;④进行批量数据插入操作;⑤监控和优化连接池性能,防止连接泄漏;⑥配置自定义负载均衡策略和故障转移机制。; 其他说明:在实际应用中,用户可以根据具体需求灵活配置MySQL MCP,以优化数据库操作性能和稳定性。建议在使用过程中结合性能监控工具,定期检查连接池状态,并根据实际情况调整配置参数。

    哈工大大作业论文:hello的一生

    哈工大大作业论文:hello的一生

    前端压测工具:Vue3性能监控的Chrome插件开发.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    visio_ppt矢量图素材-图标库1.0.pdf

    Visio学习相关文档

    COMSOL锂枝晶模型:多枝晶随机扰动生长与三种物理场分析助力锂电池研究

    内容概要:本文介绍了利用COMSOL软件对锂离子电池中锂枝晶的多枝晶随机扰动生长进行模拟的方法。通过相场、浓度场和电场三种物理场的综合分析,详细探讨了锂枝晶的生长过程及其对电池性能的影响。文章首先阐述了锂枝晶生长的重要性和研究背景,接着描述了模型的具体构建方法,包括参数设置、物理场定义以及模拟过程中的关键步骤。最后展示了模拟结果,并讨论了这些结果对于理解和优化锂离子电池的意义。 适合人群:从事锂离子电池研究的专业人士、材料科学家、物理学家及相关领域的研究人员。 使用场景及目标:适用于需要深入了解锂枝晶生长机理及其对电池性能影响的研究项目;旨在提高锂离子电池的安全性和使用寿命。 其他说明:文中提供的COMSOL代码示例可以帮助读者快速上手并进行相关实验验证。

    复刻-人工智能技术应用如何影响企业创新(2007-2023年).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/147962629

    基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)

    基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的Python代码及详细文档和PPT(高分项目)基于机器学习进行贷款中风险预测的P

    【数据库技术】MySQL数据库安装配置教程:涵盖Windows与Linux系统下的详细步骤及常见问题解决

    内容概要:本文档详细介绍了MySQL数据库在Windows和Linux系统上的安装与配置方法。对于Windows系统,涵盖了从下载、解压、配置环境变量、编写配置文件、安装服务、初始化数据库到更改密码和授权用户的完整流程。针对Linux系统,则推荐使用Docker进行安装,包括拉取镜像、运行容器、进入容器、查看容器IP地址以及增加远程访问权限等步骤。此外,还介绍了通过命令行和图形化工具(如MySQL Workbench和Navicat)连接MySQL数据库的方法。 适合人群:适合初学者和有一定经验的数据库管理员,特别是那些需要在不同操作系统环境中部署和管理MySQL数据库的技术人员。 使用场景及目标:①帮助用户掌握MySQL在Windows和Linux(基于Docker)两种环境下的安装配置;②指导用户完成MySQL的基本操作,如用户管理、权限分配和服务启动;③提供多种连接方式,确保用户能够顺利地通过命令行或图形界面工具访问和管理MySQL数据库。 阅读建议:由于文档内容较为详尽,建议读者按照实际操作系统环境选择性阅读相关章节,并在实践中逐步理解和掌握每个步骤的具体操作。同时,对于初次接触MySQL的用户,可以先尝试简单的命令行操作,再逐步过渡到使用图形化管理工具。

    Vue3错误边界处理:Sentry前端监控深度集成.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    AC DC混合微电网Simulink模型:功率控制与双向变换器研究及应用

    内容概要:本文详细介绍了基于MATLAB 2021b的AC DC混合微电网Simulink模型的设计与实现。该模型涵盖了交直流混合微电网、AC DC双向功率变换器和功率控制等关键组件。文中探讨了AC DC混合微电网的概念及其重要性,特别是在整合可再生能源方面的优势。通过Simulink建模,实现了对微电网中能量的高效管理和分配,包括对不同能源的调度、负载响应和能量存储系统的管理。此外,还讨论了模型的实际应用场景和未来的发展方向。 适合人群:从事电力系统研究、微电网设计与仿真、可再生能源集成等相关领域的研究人员和技术人员。 使用场景及目标:①用于研究和分析AC DC混合微电网的运行特性;②支持实际工程项目的规划和实施;③探索提高能源利用效率的方法。 其他说明:该模型适用于MATLAB 2021b版本,模型较大,需要较高的计算资源。

    运用Visio绘制建筑平面图01——软件介绍.pdf

    Visio学习相关文档

    QListWedget控件使用指南

    qlistwidget使用指南

    水彩插画儿童美术教学课件素材模板.pptx

    水彩插画儿童美术教学课件素材模板

    基于COMSOL的土石混合体孔隙渗流与细颗粒迁移运动的多场多相耦合数值仿真

    内容概要:本文探讨了利用COMSOL软件对土石混合体中孔隙渗流条件下细颗粒迁移运动的数值仿真研究。研究对象主要集中在河流、堤防等水利工程中的土石混合体,重点在于细颗粒在孔隙水流动下的侵蚀、移动和沉积现象。文中详细介绍了如何在COMSOL中构建土石混合体的几何和物理模型,设定相关参数和边界条件,进而模拟细颗粒的迁移路径及其速度。此外,还讨论了多场(如渗流场、变形场、应力场、损伤场)和多相介质(如土颗粒集合体、块石、空隙、孔隙)之间的耦合作用,以及骨架结构变形对整个系统稳定性的影响。最终,通过对仿真结果的分析,揭示了细颗粒迁移运动的基本规律,为预测和评估土石混合体的稳定性和结构安全性提供了理论支持。 适合人群:从事岩土工程、水利水电工程及相关领域的科研工作者和技术人员。 使用场景及目标:适用于需要深入了解土石混合体内部力学特性及长期性能变化的研究项目,旨在提高对复杂环境下土石混合体行为的理解,从而优化工程设计方案并确保施工质量。 其他说明:本研究不仅限于理论探讨,还包括实际应用案例分析,强调了数值仿真工具在解决现实世界问题时的重要性和实用性。

    气象数据可视化2.rar

    可视化大屏,大数据,毕业设计,mysql数据库

    【Three.js基础学习】36.particles-morphing-shader

    实现粒子运动切换效果 着色器的应用

    视频剪辑工具:Vue3+FFmpeg的浏览器端.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    数据同步策略:Vue3+ServiceWorker的离线缓存.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Vue 3是一款备受瞩目的JavaScript框架,它采用了基于Proxy的响应式系统,显著提升了性能和调试能力。其Composition API带来了更高效的逻辑组织方式,使代码复用变得轻而易举。Tree-shaking支持让打包后的文件体积更小,进一步优化了应用性能。Vue 3还与TypeScript深度集成,提供了更完善的类型推导,让开发过程更加顺畅。无论是构建大型应用还是小型项目,Vue 3都能凭借其出色的性能和灵活的架构,帮助开发者高效完成任务,是现代Web开发的理想选择。

    GenAI+网页数据+2025+Q1+报告

    GenAI+网页数据+2025+Q1+报告

Global site tag (gtag.js) - Google Analytics