基於HttpClient的HttpUtils(後台訪問URL)
原文:https://lxy19791111.iteye.com/blog/341409
最近做在線支付時遇到需要以後台方式訪問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);
}
}
最後更新:2017-04-02 18:44:44