使用apache HttpClient發送Http請求

在平時的工作中,經常會使用Http去訪問其他系統,此時一個Http的工具類就顯得非常重要了。給大家分享一個簡單的HttpClient的工具類,以備不時之需。

主要包括POST請求、GET請求和如何發送XML數據。

依賴的jar包如下:

<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpclient</artifactId>
     <version>4.3.6</version>
</dependency>
<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpcore</artifactId>
     <version>4.3.3</version>
</dependency>
<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>fluent-hc</artifactId>
<pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html">     <version>4.3.6</version>
</dependency>
<dependency>
     <groupId>dom4j</groupId>
     <artifactId>dom4j</artifactId>
     <version>1.6.1</version>
</dependency>



import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class HttpClientManager {
	private static int connectionTimeout = 1000;// 連接超時時間,毫秒
	private static int soTimeout = 30000;// 讀取數據超時時間,毫秒
	/** HttpClient對象 */
	private static CloseableHttpClient httpclient = HttpClients.
				custom().disableAutomaticRetries().build();
	/*** 超時設置 ****/
	private static RequestConfig requestConfig = RequestConfig.custom()
													.setSocketTimeout(soTimeout)
													.setConnectTimeout(connectionTimeout)
													.build();//設置請求和傳輸超時時間
	/**
	 * 根據給定的URL地址和參數字符串,以Get方法調用,如果成功返回true,如果失敗返回false
	 * 
	 * @param url
	 *            String url地址,不含參數
	 * @param param
	 *            String 參數字符串,例如:a=1&b=2&c=3
	 */
	public String executeGetMethod(String url, String param) {
		String strResult = "";
		StringBuffer serverURL = new StringBuffer(url);
		if (param != null && param.length() > 0) {
			serverURL.append("?");
			serverURL.append(param);
		}
		HttpGet httpget = new HttpGet(serverURL.toString());
		httpget.setConfig(requestConfig);
		CloseableHttpResponse response=null;
		try {
			response = httpclient.execute(httpget);
			HttpEntity entity = response.getEntity();
			int iGetResultCode = response.getStatusLine().getStatusCode();
			if (iGetResultCode >= 200 && iGetResultCode < 303) {
				strResult = EntityUtils.toString(entity);
			} else if (iGetResultCode >= 400 && iGetResultCode < 500) {
				strResult = "請求的目標地址不存在:" + iGetResultCode;
			} else {
				strResult = "請求錯誤:" + iGetResultCode;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			 try {
				if(response !=null){
					response.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return strResult;
	}
	
	/**
	 * 根據給定的URL地址和參數字符串,以Get方法調用,如果成功返回true,如果失敗返回false
	 * 
	 * @param url
	 *            String url地址,不含參數
	 * @param param
	 *            Map<String, Object> 參數字表單
	 * @return boolean true-成功,false失敗,如果返回成功可以getStrGetResponseBody()
	 *         獲取返回內容字符串,如果失敗,則可訪問getErrorInfo()獲取錯誤提示。
	 */
	public String executePostMethod(String strURL, Map<String, String> param) {
		String strResult = "";
		HttpPost post = new HttpPost(strURL);
		post.setConfig(requestConfig);
		List<BasicNameValuePair> paraList = new ArrayList<BasicNameValuePair>(param.size());
		for (Entry<String, String> pEntry : param.entrySet()) {
			if(null != pEntry.getValue()){
				BasicNameValuePair nv = new BasicNameValuePair(pEntry.getKey(), pEntry.getValue());
				paraList.add(nv);
			}
		}
		//使用UTF-8
		UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paraList,Charset.forName("utf-8"));
		post.setEntity(entity);
		CloseableHttpResponse response=null;
		try {
			response = httpclient.execute(post);
			int iGetResultCode = response.getStatusLine().getStatusCode(); 
			if (HttpStatus.SC_OK == iGetResultCode) {
				HttpEntity responseEntity = response.getEntity();
				strResult = EntityUtils.toString(responseEntity);
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if(response!=null){
					response.close();
				}
			} catch (IOException e) {
			}
		}
		return strResult;
	}
	
	/**
	 * 發送xml數據
	 * @param strURL
	 * @param params
	 * @return
	 */
	public String postByXml(String strURL,Map<String,String> params) {
		String strResult = "";
		CloseableHttpResponse response = null;
		try {
			HttpPost post = new HttpPost(strURL);
			post.setConfig(requestConfig);
			post.setHeader("Content-Type", "text/xml;charset=utf-8");
			String xmlData = convertMap2Xml(params);
			StringEntity se = new StringEntity(xmlData);
			post.setEntity(se);
			response = httpclient.execute(post);
			response = httpclient.execute(post);
			int iGetResultCode = response.getStatusLine().getStatusCode(); 
			if (HttpStatus.SC_OK == iGetResultCode) {
				HttpEntity responseEntity = response.getEntity();
				strResult = EntityUtils.toString(responseEntity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			 try {
				if(response !=null){
					response.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return strResult;
	}
	/**
	 * 將map轉換爲xml
	 * @param map
	 */
	private static String convertMap2Xml(Map<String,String> map) {
		Set<Entry<String,String>> entrys = map.entrySet();
		Iterator<Entry<String,String>> iter = entrys.iterator();
		Document doc = DocumentHelper.createDocument();
		Element root = DocumentHelper.createElement("xml");
		while(iter.hasNext()) {
			Entry<String,String> entry = iter.next();
			Element key = DocumentHelper.createElement(entry.getKey());
			key.addCDATA(entry.getValue());
			root.add(key);
		}
		doc.add(root);
		return doc.asXML();
	}
}

httpclient還支持使用代理的方式發送請求:

	    String proxyHost = "127.0.0.1";//代理服務器地址信息
            int proxyPort = 1080;//代理服務器端口

            SystemDefaultCredentialsProvider credentialsProvider = new SystemDefaultCredentialsProvider();
            credentialsProvider.setCredentials(new AuthScope(proxyHost, proxyPort), new UsernamePasswordCredentials("", ""));
            CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();

            HttpHost proxy = new HttpHost(proxyHost, proxyPort);
            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();//設置代理信息
            HttpGet getMethod = new HttpGet(strUrl);
            getMethod.setConfig(config);
            CloseableHttpResponse rsp = httpClient.execute(getMethod);
            str = EntityUtils.toString(rsp.getEntity());



發佈了50 篇原創文章 · 獲贊 31 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章