`
lxy19791111
  • 浏览: 480844 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

基于HttpClient的HttpUtils(后台访问URL)

    博客分类:
  • Java
阅读更多

      最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题,在网络上g了一把,发现在常用的还是Apache的HttpClient。因为以经常要用到的原故,因此我对其进行了一些简单的封装,在此将代码贴一来,希望对有需要的朋友有所帮助,呵呵...

 

      HttpUtils.java中有两个公共的静态方法,一个是URLPost,另一个是URLGet,一目了然,前者是提供POST方式提交数据的,后者是提供GET方式提交数据的。其中所需要传送的数据以Map的方式传入,剩下的工作就交给我这个HttpUtils吧!当然如果Http服务器端对所提交的数据的编码有要求的话,也没问题,你可以传入UTF-8或者GBK,当然大家还可自行增加。

 

      下面是源代码,如果使用中有什么问题,欢迎大家提出。

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * HTTP工具类
 * 
 * @author lixiangyang
 * 
 */
public class HttpUtils {

	private static Log log = LogFactory.getLog(HttpUtils.class);
	
	/**
	 * 定义编码格式 UTF-8
	 */
	public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";
	
	/**
	 * 定义编码格式 GBK
	 */
	public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";
	
	private static final String URL_PARAM_CONNECT_FLAG = "&";
	
	private static final String EMPTY = "";

	private static MultiThreadedHttpConnectionManager connectionManager = null;

	private static int connectionTimeOut = 25000;

	private static int socketTimeOut = 25000;

	private static int maxConnectionPerHost = 20;

	private static int maxTotalConnections = 20;

	private static HttpClient client;

	static{
		connectionManager = new MultiThreadedHttpConnectionManager();
		connectionManager.getParams().setConnectionTimeout(connectionTimeOut);
		connectionManager.getParams().setSoTimeout(socketTimeOut);
		connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);
		connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);
		client = new HttpClient(connectionManager);
	}
	
	/**
	 * POST方式提交数据
	 * @param url
	 * 			待请求的URL
	 * @param params
	 * 			要提交的数据
	 * @param enc
	 * 			编码
	 * @return
	 * 			响应结果
	 * @throws IOException
	 * 			IO异常
	 */
	public static String URLPost(String url, Map<String, String> params, String enc){

		String response = EMPTY;		
		PostMethod postMethod = null;
		try {
			postMethod = new PostMethod(url);
			postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
			//将表单的值放入postMethod中
			Set<String> keySet = params.keySet();
			for(String key : keySet){
				String value = params.get(key);
				postMethod.addParameter(key, value);
			}			
			//执行postMethod
			int statusCode = client.executeMethod(postMethod);
			if(statusCode == HttpStatus.SC_OK) {
				response = postMethod.getResponseBodyAsString();
			}else{
				log.error("响应状态码 = " + postMethod.getStatusCode());
			}
		}catch(HttpException e){
			log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
			e.printStackTrace();
		}catch(IOException e){
			log.error("发生网络异常", e);
			e.printStackTrace();
		}finally{
			if(postMethod != null){
				postMethod.releaseConnection();
				postMethod = null;
			}
		}
		
		return response;
	}
	
	/**
	 * GET方式提交数据
	 * @param url
	 * 			待请求的URL
	 * @param params
	 * 			要提交的数据
	 * @param enc
	 * 			编码
	 * @return
	 * 			响应结果
	 * @throws IOException
	 * 			IO异常
	 */
	public static String URLGet(String url, Map<String, String> params, String enc){

		String response = EMPTY;
		GetMethod getMethod = null;		
		StringBuffer strtTotalURL = new StringBuffer(EMPTY);
		
	    if(strtTotalURL.indexOf("?") == -1) {
	      strtTotalURL.append(url).append("?").append(getUrl(params, enc));
	    } else {
	    	strtTotalURL.append(url).append("&").append(getUrl(params, enc));
	    }
	    log.debug("GET请求URL = \n" + strtTotalURL.toString());
	    
		try {
			getMethod = new GetMethod(strtTotalURL.toString());
			getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
			//执行getMethod
			int statusCode = client.executeMethod(getMethod);
			if(statusCode == HttpStatus.SC_OK) {
				response = getMethod.getResponseBodyAsString();
			}else{
				log.debug("响应状态码 = " + getMethod.getStatusCode());
			}
		}catch(HttpException e){
			log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
			e.printStackTrace();
		}catch(IOException e){
			log.error("发生网络异常", e);
			e.printStackTrace();
		}finally{
			if(getMethod != null){
				getMethod.releaseConnection();
				getMethod = null;
			}
		}
		
		return response;
	}	

	/**
	 * 据Map生成URL字符串
	 * @param map
	 * 			Map
	 * @param valueEnc
	 * 			URL编码
	 * @return
	 * 			URL
	 */
	private static String getUrl(Map<String, String> map, String valueEnc) {
		
		if (null == map || map.keySet().size() == 0) {
			return (EMPTY);
		}
		StringBuffer url = new StringBuffer();
		Set<String> keys = map.keySet();
		for (Iterator<String> it = keys.iterator(); it.hasNext();) {
			String key = it.next();
			if (map.containsKey(key)) {
				String val = map.get(key);
				String str = val != null ? val : EMPTY;
				try {
					str = URLEncoder.encode(str, valueEnc);
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);
			}
		}
		String strURL = EMPTY;
		strURL = url.toString();
		if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {
			strURL = strURL.substring(0, strURL.length() - 1);
		}
		
		return (strURL);
	}
}

 

  • HttpUtils.rar (1.8 KB)
  • 描述: HttpUtils源代码
  • 下载次数: 584
分享到:
评论

相关推荐

    java后台访问url需要的包——httpclient方式

    java后台访问url需要的包,没时间好好整理,包可能多几个

    HttpClient访问后台服务的Restful(各种方式访问)

    使用HttpClient4.3版本,使用Springmvc的restful方式访问后台的服务

    基于HttpClient 4.3的可访问自签名HTTPS站点的新版工具类

    另外在项目中正好需要访问https协议的接口,而对应的服务器没有购买商业CA颁发的正式受信证书,只是做了个自签名(联想一下12306网站购票时提示的那个警告信息),默认情况下通过HttpClient访问会抛出异常。...

    httpclient方式调用url

    本篇文章将深入探讨如何使用HttpClient方式调用URL,以及相关的知识点。 首先,HttpClient允许我们构建复杂的HTTP请求,包括GET、POST以及其他HTTP方法。使用HttpClient调用URL的基本步骤包括创建HttpClient实例、...

    基于httpclient的文件可配置的心跳检测应用

    【标题】"基于httpclient的文件可配置的心跳检测应用"是关于利用Apache HttpClient库进行网络连接健康检查和文件变化监控的技术实现。该应用适用于分布式系统中,确保服务间的通信可靠性,同时也关注本地或远程文件...

    HttpClient代理访问网络

    HttpClient代理访问网络

    Android使用HttpClient和HttpsUrlConnection两种方式访问https网站

    本文将详细介绍如何使用`HttpClient`和`HttpsURLConnection`两种方式来访问HTTPS网站,包括验证证书和不验证证书的实现方法。 ### 1. Android中的HttpClient `HttpClient`是Apache提供的一种HTTP客户端库,它支持...

    java使用HttpClient通过url下载文件到本地

    在这个特定的场景中,我们利用HttpClient来从指定的URL下载文件到本地。以下是对这个主题的详细阐述: 1. **HttpClient介绍**: HttpClient是一个Java库,支持HTTP/1.1协议以及部分HTTP/2特性。它提供了一组高级...

    httpclient来进行https访问

    根据提供的文件信息,我们可以深入探讨如何使用`httpclient`库来进行`https`访问,并了解其中涉及的关键概念和技术细节。 ### 标题与描述解析:使用`httpclient`进行`https`访问 #### 1. `httpclient`简介 `...

    基于httpClient的文件编码导入系统

    在IT行业中,基于httpClient的文件编码导入系统是一个常见的应用场景,主要涉及到网络通信和数据处理两个核心领域。HttpClient是Apache开源组织提供的一款强大的HTTP客户端库,它允许开发者在Java环境中发送HTTP请求...

    使用httpclient访问servlet

    设置URL为Servlet的访问路径,可以通过`setURI(URI uri)`方法。如果需要POST请求,可以使用`setEntity(HttpEntity entity)`设置请求体。 4. **执行请求**: 使用HttpClient的`execute(HttpUriRequest request)`...

    基于HttpClient与HTMLParser 的网页正文提取

    3. 网页抓取和分析方法的实现:文章中提出的基于HttpClient与HTMLParser的网页抓取解析方法,结合了两者的优点,实现了快速且有效的网页内容抓取和正文提取。该方法能够针对特定的网页内容进行深入分析,并能够应对...

    httpUtil httpclient 登陆携带cookie访问下一个连接

    在这个场景中,我们关注的是如何使用`httpclient`进行模拟登录并携带cookie来访问后续的URL。这个过程通常涉及到处理session和身份验证,对于开发需要登录功能的Web应用或自动化测试脚本尤其有用。 首先,`...

    HttpClient接口调用工具类(附带demo)

    只需提供URL作为构造函数的参数,然后同样通过`HttpClient`的`execute`方法执行请求。 3. **Put请求**: Put请求常用于更新已有资源。在HttpClient中,使用`HttpPut`类创建PUT请求,设置请求URL,然后将要更新的...

    使用httpClient访问https+443端口号。

    标题中的“使用httpClient访问https+443端口号”指的是使用Apache HttpClient库来发起HTTPS(安全超文本传输协议)请求,目标服务器的默认端口是443。HTTPS是一种基于SSL/TLS的安全通信协议,用于在客户端和服务器...

Global site tag (gtag.js) - Google Analytics