基于commons-httpclient-3.1.jar封装的HttpClientUtil工具类
package com.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.params.HttpMethodParams;
import com.base.utils.MD5;
import com.base.utils.ParaMap;
import com.base.web.AppConfig;
public class HttpClientUtil
{
public static final String UTF8= "GBK";
private static final String VE= "2";
// 请求成功
public static final int SUCCESS= 1;
// 请求失败
public static final int ERROR= 2;
// 网络错误
public static final int NET_ERROR= 3;
// 读取超时
private final static int SOCKET_TIMEOUT = 20000;
// 连接超时
private final static int CONNECTION_TIMEOUT = 20000;
// 每个HOST的最大连接数量(连接至目的主机的线程数)
private final static int MAX_CONN_PRE_HOST = 5;
// 连接池的最大连接数(相当于线程数)
private final static int MAX_CONN = 5;
// 连接池
private final static HttpConnectionManager HTTPCONNECTIONMANAGER;
private final static HttpClient CLIENT;
static {
HTTPCONNECTIONMANAGER = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = HTTPCONNECTIONMANAGER.getParams();
params.setConnectionTimeout(CONNECTION_TIMEOUT);
params.setSoTimeout(SOCKET_TIMEOUT);
params.setDefaultMaxConnectionsPerHost(MAX_CONN_PRE_HOST);
params.setMaxTotalConnections(MAX_CONN);
CLIENT = new HttpClient(HTTPCONNECTIONMANAGER);
}
/**
* 用HttpClient发送post请求
*
* @param URL
* @param inMap
* @author lgr
*/
public static ParaMap post(String URL, ParaMap inMap)
{
ParaMap out= new ParaMap();
PostMethod post= new PostMethod(URL);
post.setRequestHeader("Content-Type", "text/x-www-form-urlencoded");
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "GBK");
List<NameValuePair> params= new ArrayList<NameValuePair>();
NameValuePair[] arr = {};
params.add(new NameValuePair("sign", sign(inMap)));
Set<Map.Entry<String, Object>> entrys= inMap.entrySet();
for(Map.Entry<String, Object> entry: entrys)
{
params.add(new NameValuePair(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())));
}
try
{
post.setRequestBody(params.toArray(arr));
int status= CLIENT.executeMethod(post);
String result= new String(post.getResponseBody(), UTF8);
out.put("data", result);
}
catch(UnsupportedEncodingException e1)
{
}
catch(IOException e)
{
}
finally
{
post.releaseConnection();
}
return out;
}
/**
* 用HttpClient发送post请求
*
* @param URL
* @param inMap
* @author lgr
* @throws FileNotFoundException
*/
@SuppressWarnings("unchecked")
public static ParaMap postFile(String URL, ParaMap inMap) throws FileNotFoundException
{
ParaMap out= new ParaMap();
PostMethod post= new PostMethod(URL);
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, UTF8);
Part[] parts={};
List<StringPart> params= new ArrayList<StringPart>();
Set<Map.Entry<String, Object>> entrys= inMap.entrySet();
for(Map.Entry<String, Object> entry: entrys) {
params.add(new StringPart(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())));
}
try{
post.setRequestEntity(new MultipartRequestEntity(params.toArray(parts), post.getParams()));
int status= CLIENT.executeMethod(post);
String result= new String(post.getResponseBody(), UTF8);
out.put("data", result);
}
catch(UnsupportedEncodingException e1)
{
}
catch(IOException e)
{
}
finally
{
post.releaseConnection();
}
return out;
}
/**
* get请求
* @param URL
* @param inMap
* @return
* @author lgr
*/
public static ParaMap get(String URL, ParaMap inMap)
{
ParaMap out= new ParaMap();
URL = getFinalURL(URL, inMap);
GetMethod get = new GetMethod(URL);
// get.getParams().setParameter(HttpMethodParams.HTTP_URI_CHARSET, "GBK");
try
{
int status= CLIENT.executeMethod(get);
String result= new String(get.getResponseBody(), UTF8);
out.put("data", result);
}
catch(UnsupportedEncodingException e1)
{
}
catch(IOException e)
{
}
finally
{
get.releaseConnection();
}
return out;
}
private static String getFinalURL(String URL, ParaMap parameter){
StringBuilder sb = new StringBuilder(URL);
sb.append("?");
sb.append("sign=" + sign(parameter));
if(!parameter.isEmpty()){
sb.append("&");
Set<Map.Entry<String, Object>> entrys= parameter.entrySet();
for(Map.Entry<String, Object> entry: entrys)
{
sb.append(String.valueOf(entry.getKey()))
.append("=")
.append(String.valueOf(entry.getValue()))
.append("&");
}
return sb.substring(0, sb.length()-1);
}else
{
return sb.toString();
}
}
private static String getFinalURLWithoutSign(String URL, ParaMap parameter){
StringBuilder sb = new StringBuilder(URL);
if(!parameter.isEmpty()){
sb.append("?");
Set<Map.Entry<String, Object>> entrys= parameter.entrySet();
for(Map.Entry<String, Object> entry: entrys)
{
sb.append(String.valueOf(entry.getKey()))
.append("=")
.append(String.valueOf(entry.getValue()))
.append("&");
}
return sb.substring(0, sb.length()-1);
}else{
return URL;
}
}
/**
* 签名
*
* @param inMap
* @return
* @author lgr
*/
public static String sign(ParaMap inMap)
{
inMap.put("ve", VE);
Set<Map.Entry<String, Object>> entrys= inMap.entrySet();
StringBuilder str= new StringBuilder();
for(Map.Entry<String, Object> entry: entrys)
{
String key= String.valueOf(entry.getKey());
if("sign".equals(key))
{
continue;
}
if("requestKey".equals(key))
{
continue;
}
String value= String.valueOf(entry.getValue());
if(str.length()== 0)
{
str.append(key+ "="+ value);
}
else
{
str.append("&"+ key+ "="+ value);
}
}
str.append("&requestKey="+ AppConfig.getStringPro("md5Key"));
return MD5.MD5Encode(str.toString());
}
/**
* 判断请求是否成功
*
* @param inMap
* @return
* @author lgr
*/
public static boolean isSuccess(ParaMap inMap)
{
return inMap.getInt("state")== SUCCESS;
}
/**
* 用HttpClient发送post请求
*
* @param URL
* @param inMap
* @author lgr
* @throws FileNotFoundException
*/
@SuppressWarnings("unchecked")
public static ParaMap postFile(String URL, ParaMap inMap,byte [] content) throws FileNotFoundException
{
ParaMap out= new ParaMap();
PostMethod post= new PostMethod(URL);
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, UTF8);
Part[] parts={};
List<Object> params= new ArrayList<Object>();
Set<Map.Entry<String, Object>> entrys= inMap.entrySet();
for(Map.Entry<String, Object> entry: entrys) {
params.add(new StringPart(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())));
}
if(content.length>0){
//如果有文件上传
params.add(new FilePart("content", new ByteArrayPartSource("", content)));
}
try{
post.setRequestEntity(new MultipartRequestEntity(params.toArray(parts), post.getParams()));
int status= CLIENT.executeMethod(post);
String result= new String(post.getResponseBody(), UTF8);
out.put("data", result);
}
catch(UnsupportedEncodingException e1)
{
}
catch(IOException e)
{
}
finally
{
post.releaseConnection();
}
return out;
}
}