您的位置:首页 > 理论基础 > 计算机网络

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

2016-03-20 00:09 477 查看
转载地址:http://lxy19791111.iteye.com/blog/341409

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

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

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

Java代码


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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: