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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM