HttpClient之用CloseableHttpClient傳送post請求
使用HttpClient傳送請求的一般步驟
(1) 建立HttpClient物件。
(2)建立請求方法的例項,並指定請求URL。如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。
(3) 如果需要傳送請求引數,可呼叫HttpGet同的setParams(HetpParams params)方法來新增請求引數;對於HttpPost物件而言,可呼叫setEntity(HttpEntity entity)方法來設定請求引數。
(4) 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,該方法返回一個HttpResponse。
(5) 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;呼叫HttpResponse的getEntity()方法可獲取HttpEntity物件,該物件包裝了伺服器的響應內容。程式可通過該物件獲取伺服器的響應內容。
(6) 釋放連線。無論執行方法是否成功,都必須釋放連線
程式碼如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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.HttpPost;
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.apache.log4j.Logger;
public class HttpTest {
protected static Logger logger = Logger.getLogger(HttpTest.class); //請求超時時間,這個時間定義了socket讀資料的超時時間,也就是連線到伺服器之後到從伺服器獲取響應資料需要等待的時間,發生超時,會丟擲SocketTimeoutException異常。 private static final int SOCKET_TIME_OUT = 60000; //連線超時時間,這個時間定義了通過網路與伺服器建立連線的超時時間,也就是取得了連線池中的某個連線之後到接通目標url的連線等待時間。發生超時,會丟擲ConnectionTimeoutException異常 private static final int CONNECT_TIME_OUT = 60000; private static List<NameValuePair> createParam(Map<String, Object> param) { //建立一個NameValuePair陣列,用於儲存欲傳送的引數 List<NameValuePair> nvps = new ArrayList <NameValuePair>(); if(param != null) { for(String k : param.keySet()) { nvps.add(new BasicNameValuePair(k, param.get(k).toString())); } } return nvps; } /** * 傳送 post 請求 * @param url 請求地址,如 http://www.baidu.com * @param param相關引數, 模擬form 提交 * @return * @throws Exception */ public static String postForAPP(String url, String sMethod, Map<String, Object> param, Map<String, Object> headers) throws Exception { //目前HttpClient最新版的實現類為CloseableHttpClient CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = null; HttpEntity entity=null; try { if(param != null) { //建立Request的物件,一般用目標url來構造,Request一般配置addHeader、setEntity、setConfig HttpPost req = new HttpPost(url); entity=new UrlEncodedFormEntity(createParam(param), Consts.UTF_8); //setHeader,新增標頭檔案 Set<String> keys = headers.keySet(); for (String key : keys) { req.setHeader(key, headers.get(key).toString()); } //setConfig,新增配置,如設定請求超時時間,連線超時時間 RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build(); req.setConfig(reqConfig); //setEntity,新增內容 req.setEntity(entity); //執行Request請求,CloseableHttpClient的execute方法返回的response都是CloseableHttpResponse型別 //其常用方法有getFirstHeader(String)、getLastHeader(String)、headerIterator(String)取得某個Header name對應的迭代器、getAllHeaders()、getEntity、getStatus等 response = client.execute(req); entity = response.getEntity(); //用EntityUtils.toString()這個靜態方法將HttpEntity轉換成字串,防止伺服器返回的資料帶有中文,所以在轉換的時候將字符集指定成utf-8就可以了 String result= EntityUtils.toString(entity, "UTF-8"); logger.error("-------------------------"+result+"-------------"); if(response.getStatusLine().getStatusCode()==200){ logger.error(result+"-----------success------------------"); return result; }else{ logger.error(response.getStatusLine().getStatusCode()+"------------------fail-----------"); return null; } } return null; } catch(Exception e) { logger.error("--------------------------post error: ", e); throw new Exception(); }finally{ //一定要記得把entity fully consume掉,否則連線池中的connection就會一直處於佔用狀態 EntityUtils.consume(entity); logger.error("---------------------------finally-------------"); System.out.println("---------------------------------------------------"); } } public static void main(String[] args) throws Exception { Map<String, Object> param=new HashMap<String, Object>(); param.put("pdata", "mm"); Map<String, Object> headers=new HashMap<String, Object>(); headers.put("appid", "mm"); postForAPP("http://localhost:8080/SpringMVC-httpclient/greeting", "aa", param, headers); }
}
專案程式碼稍後上傳,專案名稱為SpringMVC-httpclient