HttpClient請求資訊get/post聯合
/**
*
*/
package com.bycm.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpHost;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
/**
* @author jinyulinlang date:2018年7月18日
*/
public class HttpInvoker {
private static HttpInvoker httpInvoker = new HttpInvoker();
//
private HttpClient httpClient = null;
// 編碼格式
private String charset = "gbk";
// 請求超時時間
private int timeout = 10000;
private int connecTimeout = 10000;
// 是否使用代理伺服器
private boolean useProxy = false;
// 代理伺服器主機域名
private String proxyHost = null;
// 代理伺服器埠號
private int proxyPort;
// 代理伺服器使用者的名稱
private String proxyUsername = null;
// 代理伺服器使用者的密碼
private String proxyPassword = null;
// 是否已經被初始化
private boolean initialized = false;
// 簡單工廠例項化
public static HttpInvoker getInstance() {
return httpInvoker;
}
/**
* 無參構造
*/
private HttpInvoker() {
httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
httpClient.getParams().setParameter("http.protocol.content-charset", "gbk");
httpClient.getParams().setContentCharset("gbk");
httpClient.getParams().setSoTimeout(timeout);
}
/**
* 帶參構造
*
* @param charset
* 編碼格式
* @param timeout
* 過期時間
* @param useProxy
* 是否代理伺服器
* @param proxyHost
* 代理伺服器
* @param proxyPort
* 伺服器埠號
* @param proxyUsername
* 代理伺服器使用者名稱
* @param proxyPassword
* 代理伺服器密碼
*/
public HttpInvoker(String charset, int timeout, boolean useProxy, String proxyHost, int proxyPort,
String proxyUsername, String proxyPassword) {
httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
// 付過編碼格式不為空
if (charset != null && !charset.trim().equals("")) {
this.charset = charset;
}
// 如果過期時間
if (timeout > 0) {
this.timeout = timeout;
}
/************ 實驗 *************/
// 對請求資訊頭部的設定
/************ 實驗 *************/
// 設定請求協議的編碼格式
httpClient.getParams().setParameter("http.protocol.content-charset", charset);
// 設定內容的編碼格式
httpClient.getParams().setContentCharset(charset);
// 設定連結超時
httpClient.getParams().setConnectionManagerTimeout(connecTimeout);
// 請求超時
httpClient.getParams().setSoTimeout(timeout);
// 如果使用代理伺服器的話代理伺服器不為空或者伺服器埠大於0
if (useProxy && proxyHost != null && !proxyHost.trim().equals("") && proxyPort > 0) {
// 宣告一個主機配置類
HostConfiguration hc = new HostConfiguration();
hc.setProxy(proxyHost, proxyPort);
httpClient.setHostConfiguration(hc);
if (proxyUsername != null && !proxyUsername.trim().equals("") && proxyPassword != null
&& !proxyPassword.trim().equals("")) {
httpClient.getState().setProxyCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(proxyUsername, proxyPassword));
}
}
initialized = true;
}
public void setCharset(String charset) {
this.charset = charset;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
public void setProxyUsername(String proxyUsername) {
this.proxyUsername = proxyUsername;
}
public void setProxyPassword(String proxyPassword) {
this.proxyPassword = proxyPassword;
}
public void setUseProxy(boolean useProxy) {
this.useProxy = useProxy;
}
public synchronized boolean isInitialized() {
return initialized;
}
/**
*
*/
public synchronized void init() {
if (charset != null && !charset.trim().equals("")) {
httpClient.getParams().setParameter("http.protocol.content-charset", charset);
httpClient.getParams().setContentCharset(charset);
}
if (timeout > 0) {
httpClient.getParams().setSoTimeout(timeout);
}
if (useProxy && proxyHost != null && !proxyHost.trim().equals("") && proxyPort > 0) {
HostConfiguration hc = new HostConfiguration();
hc.setProxy(proxyHost, proxyPort);
httpClient.setHostConfiguration(hc);
if (proxyUsername != null && !proxyUsername.trim().equals("") && proxyPassword != null
&& !proxyPassword.trim().equals("")) {
httpClient.getState().setProxyCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(proxyUsername, proxyPassword));
}
}
initialized = true;
}
/**
* 無參請求
*
* @param url
* @return
* @throws Exception
*/
public String invoke(String url) throws Exception {
return invoke(url, null, false);
}
/**
*
* @param url
* 請求路徑
* @param params
* 請求攜帶的引數
* @param isPost
* 是否使用post請求
* @return
* @throws IOException
*/
public String invoke(String url, Map<String, Object> params, boolean isPost) throws IOException {
HttpMethod httpMethod = null;
String result = "";
if (isPost && params != null && params.size() > 0) {
Iterator<String> paramKeys = params.keySet().iterator();
httpMethod = new PostMethod(url);
NameValuePair[] nvp = new NameValuePair[params.size()];
int count = 0;
while (paramKeys.hasNext()) {
String key = (String) paramKeys.next();
Object value = params.get(key);
if (value != null && value instanceof String && !value.equals("")) {
nvp[count] = new NameValuePair(key, (String) value);
count++;
} else if (value != null && value instanceof String[] && ((String[]) value).length > 0) {
NameValuePair[] tempNvp = new NameValuePair[nvp.length + ((String[]) value).length - 1];
for (int i = 0; i < count; i++) {
tempNvp[i] = nvp[i];
}
nvp = tempNvp;
for (String v : (String[]) value) {
nvp[count] = new NameValuePair(key, (String) v);
count++;
}
}
}
((PostMethod) httpMethod).setRequestBody(nvp);
} else {
if (params != null && params.size() > 0) {
Iterator<String> paramKeys = params.keySet().iterator();
StringBuffer getUrl = new StringBuffer(url.trim());
if (url.trim().indexOf("?") > -1) {
if (url.trim().indexOf("?") < url.trim().length() - 1
&& url.trim().indexOf("&") < url.trim().length() - 1) {
getUrl.append("&");
}
} else {
getUrl.append("?");
}
while (paramKeys.hasNext()) {
String key = paramKeys.next();
Object value = params.get(key);
if (value != null && value instanceof String && !value.equals("")) {
getUrl.append(key).append("=").append(value).append("&");
} else if (value != null && value instanceof String[] && ((String[]) value).length > 0) {
for (String v : (String[]) value) {
getUrl.append(key).append("=").append(v).append("&");
}
}
}
// 如果get請求的url最後一個字元是&則把他給去掉
if (getUrl.lastIndexOf("&") == getUrl.length() - 1) {
httpMethod = new GetMethod(getUrl.substring(0, getUrl.length() - 1));
} else {
httpMethod = new GetMethod(getUrl.toString());
}
} else {
httpMethod = new GetMethod(url);
}
httpClient.executeMethod(httpMethod);
result = httpMethod.getResponseBodyAsString();
BufferedReader reader = new BufferedReader(
new InputStreamReader(httpMethod.getResponseBodyAsStream(), charset));
String line = null;
String html = null;
while ((line = reader.readLine()) != null) {
if (html == null) {
html = "";
} else {
html += "\r\n";
}
html += line;
}
if (html != null) {
result = new String(html.getBytes(charset), charset);
}
}
// 釋放連結
httpMethod.releaseConnection();
return result;
}
}