import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StreamUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; public class HttpUtils { private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class); /** * 執行一個HTTP GET請求,返回請求響應的HTML * * @param url 請求的URL地址 * @return 返回請求響應的HTML */ public static int doGet(String url) { HttpClient client = new HttpClient(); HttpMethod method = new GetMethod(url); try { client.executeMethod(method); } catch (URIException e) { logger.error("執行HTTP Get請求時,發生異常!", e); return HttpStatus.SC_BAD_REQUEST; } catch (IOException e) { logger.error("執行HTTP Get請求" + url + "時,發生異常!", e); return HttpStatus.SC_BAD_REQUEST; } finally { method.releaseConnection(); } logger.info("執行HTTP GET請求,返回碼: {}", method.getStatusCode()); return method.getStatusCode(); } /** * 執行一個帶參數的HTTP GET請求,返回請求響應的JSON字符串 * * @param url 請求的URL地址 * @return 返回請求響應的JSON字符串 */ public static String doGet(String url, String param) { // 構造HttpClient的實例 HttpClient client = new HttpClient(); //設置參數 // 建立GET方法的實例 GetMethod method = new GetMethod(url + "?" + param); // 使用系統提供的默認的恢復策略 method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { // 執行getMethod client.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { return StreamUtils.copyToString(method.getResponseBodyAsStream(), Charset.forName("utf-8")); } } catch (IOException e) { logger.error("執行HTTP Get請求" + url + "時,發生異常!", e); } finally { method.releaseConnection(); } return null; } /** * 執行一個HTTP GET請求,返回請求響應的HTML * * @param url 請求的URL地址 * @param queryString 請求的查詢參數,能夠爲null * @param charset 字符集 * @param pretty 是否美化 * @return 返回請求響應的HTML */ public static String doGet(String url, String queryString, String charset, boolean pretty) { //logger.info("http的請求地址爲:"+url); logger.info("http的請求參數爲:" + queryString); StringBuffer response = new StringBuffer(); HttpClient client = new HttpClient(); HttpMethod method = new GetMethod(url); try { if (StringUtils.isNotBlank(queryString)) { method.setQueryString(URIUtil.encodeQuery(queryString)); } HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams(); // 設置鏈接的超時時間 managerParams.setConnectionTimeout(3 * 60 * 1000); // 設置讀取數據的超時時間 managerParams.setSoTimeout(5 * 60 * 1000); client.executeMethod(method); logger.info("http的請求地址爲:" + url + ",返回的狀態碼爲" + method.getStatusCode()); BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset)); String line; while ((line = reader.readLine()) != null) { if (pretty) { response.append(line).append(System.getProperty("line.separator")); } else { response.append(line); } } reader.close(); } catch (Exception e) { logger.error("執行HTTP Get請求" + url + "時,發生異常!" + e); return response.toString(); } finally { method.releaseConnection(); } return response.toString(); } /** * 執行一個帶參數的HTTP POST請求,返回請求響應的JSON字符串 * * @param url 請求的URL地址 * @param map 請求的map參數 * @return 返回請求響應的JSON字符串 */ public static String doPost(String url, Map<String, Object> map) { // 構造HttpClient的實例 HttpClient httpClient = new HttpClient(); // 建立POST方法的實例 PostMethod method = new PostMethod(url); // 這個basicNameValue**放在List中 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); // 建立basicNameValue***對象參數 if (map != null) { for (Map.Entry<String, Object> entry : map.entrySet()) { nameValuePairs.add(new NameValuePair(entry.getKey(), entry.getValue().toString())); } } // 填入各個表單域的值 NameValuePair[] param = nameValuePairs.toArray(new NameValuePair[nameValuePairs.size()]); method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); // 將表單的值放入postMethod中 method.addParameters(param); try { // 執行postMethod int statusCode = httpClient.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { return StreamUtils.copyToString(method.getResponseBodyAsStream(), Charset.forName("utf-8")); } } catch (UnsupportedEncodingException e1) { logger.error(e1.getMessage()); } catch (IOException e) { logger.error("執行HTTP Post請求" + url + "時,發生異常!" + e.toString()); } finally { method.releaseConnection(); } return null; } /** * 執行一個HTTP POST請求,返回請求響應的HTML * * @param url 請求的URL地址 * @param reqStr 請求的查詢參數,能夠爲null * @param charset 字符集 * @return 返回請求響應的HTML */ public static String doPost(String url, String reqStr, String contentType, String charset) { HttpClient client = new HttpClient(); PostMethod method = new PostMethod(url); try { HttpConnectionManagerParams managerParams = client .getHttpConnectionManager().getParams(); managerParams.setConnectionTimeout(30000); // 設置鏈接超時時間(單位毫秒) managerParams.setSoTimeout(30000); // 設置讀數據超時時間(單位毫秒) method.setRequestEntity(new StringRequestEntity(reqStr, contentType, "utf-8")); client.executeMethod(method); logger.info("返回的狀態碼爲" + method.getStatusCode()); if (method.getStatusCode() == HttpStatus.SC_OK) { return StreamUtils.copyToString(method.getResponseBodyAsStream(), Charset.forName(charset)); } } catch (UnsupportedEncodingException e1) { logger.error(e1.getMessage()); return ""; } catch (IOException e) { logger.error("執行HTTP Post請求" + url + "時,發生異常!" + e.toString()); return ""; } finally { method.releaseConnection(); } return null; } /** * @param url * @param entity * @return * @throws IOException */ public static String doPost(String url, HttpEntity entity) { //建立httpclient對象 CloseableHttpClient client = HttpClients.createSystem(); //建立post方式請求對象 HttpPost httpPost = new HttpPost(url); //設置參數到請求對象中 httpPost.setEntity(entity); BufferedReader reader = null; try { CloseableHttpResponse response = client.execute(httpPost); logger.info("Status:" + response.getStatusLine().getStatusCode()); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String inputLine; StringBuffer buffer = new StringBuffer(); while ((inputLine = reader.readLine()) != null) { buffer.append(inputLine); } reader.close(); return buffer.toString(); } } catch (IOException ex) { logger.info("執行http post請求出錯,exception={}", ex.getMessage()); } finally { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }
注:java
若是PostMethod提交的是中文字符,須要加上相應的編碼格式: post.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
若是GetMethod提交的參數有中文字符,須要先轉換成utf-8格式:String param = "enterpriseName="+ URLEncoder.encode("中國移動", "utf-8"); HttpUtil.doGet(param, url);spring
maven依賴說明
commons-httpclient 是 apache-commons 項目下的一個子項目,後來被 HttpComponents 取代,後者提供了更好的性能和更大的靈活性。apache
commons-httpclient的GAV地址爲
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
其最新版本爲3.1,且已經再也不更新;
HttpComponents的GAV地址爲
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>app