JAVA的第三方庫(kù)HttpClient使用詳解

JAVA的第三方庫(kù)HttpClient使用詳解

一.簡(jiǎn)介

HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來(lái)提供高效的慢逾、最新的晋渺、功能豐富的支持HTTP協(xié)議的客戶端編程工具包窄驹,并且它支持HTTP協(xié)議最新的版本和建議违柏。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個(gè)開(kāi)源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient香椎。
下載地址:http://hc.apache.org/downloads.cgi

二.特性

  1. 基于標(biāo)準(zhǔn)漱竖、純凈的Java語(yǔ)言。實(shí)現(xiàn)了Http1.0和Http1.1
  2. 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實(shí)現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)畜伐。
  3. 支持HTTPS協(xié)議馍惹。
  4. 通過(guò)Http代理建立透明的連接。
  5. 利用CONNECT方法通過(guò)Http代理建立隧道的https連接玛界。
  6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案万矾。
  7. 插件式的自定義認(rèn)證方案。
  8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案慎框。
  9. 連接管理器支持多線程應(yīng)用良狈。支持設(shè)置最大連接數(shù),同時(shí)支持設(shè)置每個(gè)主機(jī)的最大連接數(shù)笨枯,發(fā)現(xiàn)并關(guān)閉過(guò)期的連接薪丁。
  10. 自動(dòng)處理Set-Cookie中的Cookie。
  11. 插件式的自定義Cookie策略馅精。
  12. Request的輸出流可以避免流中內(nèi)容直接緩沖到socket服務(wù)器严嗜。
  13. Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容。
  14. 在http1.0和http1.1中利用KeepAlive保持持久連接洲敢。
  15. 直接獲取服務(wù)器發(fā)送的response code和 headers漫玄。
  16. 設(shè)置連接超時(shí)的能力。
  17. 實(shí)驗(yàn)性的支持http1.1 response caching压彭。
  18. 源代碼基于Apache License 可免費(fèi)獲取睦优。

三.使用方法

使用HttpClient發(fā)送請(qǐng)求、接收響應(yīng)很簡(jiǎn)單哮塞,一般需要如下幾步即可刨秆。

  1. 創(chuàng)建HttpClient對(duì)象。
  2. 創(chuàng)建請(qǐng)求方法的實(shí)例忆畅,并指定請(qǐng)求URL衡未。如果需要發(fā)送GET請(qǐng)求尸执,創(chuàng)建HttpGet對(duì)象;如果需要發(fā)送POST請(qǐng)求缓醋,創(chuàng)建HttpPost對(duì)象如失。
  3. 如果需要發(fā)送請(qǐng)求參數(shù),可調(diào)用HttpGet送粱、HttpPost共同的setParams(HetpParams params)方法來(lái)添加請(qǐng)求參數(shù)褪贵;對(duì)于HttpPost對(duì)象而言,也可調(diào)用setEntity(HttpEntity entity)方法來(lái)設(shè)置請(qǐng)求參數(shù)抗俄。
  4. 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求脆丁,該方法返回一個(gè)HttpResponse。
  5. 調(diào)用HttpResponse的getAllHeaders()动雹、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭槽卫;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容胰蝠。程序可通過(guò)該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容歼培。
  6. 釋放連接。無(wú)論執(zhí)行方法是否成功茸塞,都必須釋放連接

四.實(shí)例

/** 
 * HttpClient連接SSL 
 */  
public void ssl() {  
    CloseableHttpClient httpclient = null;  
    try {  
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
        FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));  
        try {  
            // 加載keyStore d:\\tomcat.keystore    
            trustStore.load(instream, "123456".toCharArray());  
        } catch (CertificateException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                instream.close();  
            } catch (Exception ignore) {  
            }  
        }  
        // 相信自己的CA和所有自簽名的證書  
        SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();  
        // 只允許使用TLSv1協(xié)議  
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,  
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);  
        httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();  
        // 創(chuàng)建http請(qǐng)求(get方式)  
        HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");  
        System.out.println("executing request" + httpget.getRequestLine());  
        CloseableHttpResponse response = httpclient.execute(httpget);  
        try {  
            HttpEntity entity = response.getEntity();  
            System.out.println("----------------------------------------");  
            System.out.println(response.getStatusLine());  
            if (entity != null) {  
                System.out.println("Response content length: " + entity.getContentLength());  
                System.out.println(EntityUtils.toString(entity));  
                EntityUtils.consume(entity);  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ParseException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (KeyManagementException e) {  
        e.printStackTrace();  
    } catch (NoSuchAlgorithmException e) {  
        e.printStackTrace();  
    } catch (KeyStoreException e) {  
        e.printStackTrace();  
    } finally {  
        if (httpclient != null) {  
            try {  
                httpclient.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  

/** 
 * post方式提交表單(模擬用戶登錄請(qǐng)求) 
 */  
public void postForm() {  
    // 創(chuàng)建默認(rèn)的httpClient實(shí)例.    
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    // 創(chuàng)建httppost    
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
    // 創(chuàng)建參數(shù)隊(duì)列    
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
    formparams.add(new BasicNameValuePair("username", "admin"));  
    formparams.add(new BasicNameValuePair("password", "123456"));  
    UrlEncodedFormEntity uefEntity;  
    try {  
        uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
        httppost.setEntity(uefEntity);  
        System.out.println("executing request " + httppost.getURI());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            HttpEntity entity = response.getEntity();  
            if (entity != null) {  
                System.out.println("--------------------------------------");  
                System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
                System.out.println("--------------------------------------");  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (UnsupportedEncodingException e1) {  
        e1.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 關(guān)閉連接,釋放資源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

/** 
 * 發(fā)送 post請(qǐng)求訪問(wèn)本地應(yīng)用并根據(jù)傳遞參數(shù)不同返回不同結(jié)果 
 */  
public void post() {  
    // 創(chuàng)建默認(rèn)的httpClient實(shí)例.    
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    // 創(chuàng)建httppost    
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
    // 創(chuàng)建參數(shù)隊(duì)列    
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
    formparams.add(new BasicNameValuePair("type", "house"));  
    UrlEncodedFormEntity uefEntity;  
    try {  
        uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
        httppost.setEntity(uefEntity);  
        System.out.println("executing request " + httppost.getURI());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            HttpEntity entity = response.getEntity();  
            if (entity != null) {  
                System.out.println("--------------------------------------");  
                System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
                System.out.println("--------------------------------------");  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (UnsupportedEncodingException e1) {  
        e1.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 關(guān)閉連接,釋放資源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

/** 
 * 發(fā)送 get請(qǐng)求 
 */  
public void get() {  
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    try {  
        // 創(chuàng)建httpget.    
        HttpGet httpget = new HttpGet("http://www.baidu.com/");  
        System.out.println("executing request " + httpget.getURI());  
        // 執(zhí)行g(shù)et請(qǐng)求.    
        CloseableHttpResponse response = httpclient.execute(httpget);  
        try {  
            // 獲取響應(yīng)實(shí)體    
            HttpEntity entity = response.getEntity();  
            System.out.println("--------------------------------------");  
            // 打印響應(yīng)狀態(tài)    
            System.out.println(response.getStatusLine());  
            if (entity != null) {  
                // 打印響應(yīng)內(nèi)容長(zhǎng)度    
                System.out.println("Response content length: " + entity.getContentLength());  
                // 打印響應(yīng)內(nèi)容    
                System.out.println("Response content: " + EntityUtils.toString(entity));  
            }  
            System.out.println("------------------------------------");  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (ParseException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 關(guān)閉連接,釋放資源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

/** 
 * 上傳文件 
 */  
public void upload() {  
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    try {  
        HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");  

        FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg"));  
        StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);  

        HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build();  

        httppost.setEntity(reqEntity);  

        System.out.println("executing request " + httppost.getRequestLine());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            System.out.println("----------------------------------------");  
            System.out.println(response.getStatusLine());  
            HttpEntity resEntity = response.getEntity();  
            if (resEntity != null) {  
                System.out.println("Response content length: " + resEntity.getContentLength());  
            }  
            EntityUtils.consume(resEntity);  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躲庄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钾虐,更是在濱河造成了極大的恐慌噪窘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禾唁,死亡現(xiàn)場(chǎng)離奇詭異效览,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荡短,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門丐枉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掘托,你說(shuō)我怎么就攤上這事瘦锹。” “怎么了闪盔?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵弯院,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泪掀,道長(zhǎng)听绳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任异赫,我火速辦了婚禮椅挣,結(jié)果婚禮上头岔,老公的妹妹穿的比我還像新娘。我一直安慰自己鼠证,他們只是感情好峡竣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著量九,像睡著了一般适掰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荠列,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天类浪,我揣著相機(jī)與錄音,去河邊找鬼肌似。 笑死戚宦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锈嫩。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼垦搬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呼寸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猴贰,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤对雪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后米绕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瑟捣,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年栅干,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迈套。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碱鳞,死狀恐怖桑李,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窿给,我是刑警寧澤贵白,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站崩泡,受9級(jí)特大地震影響禁荒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜角撞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一呛伴、第九天 我趴在偏房一處隱蔽的房頂上張望勃痴。 院中可真熱鬧,春花似錦磷蜀、人聲如沸召耘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)污它。三九已至,卻和暖如春庶弃,著一層夾襖步出監(jiān)牢的瞬間衫贬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工歇攻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留固惯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓缴守,卻偏偏與公主長(zhǎng)得像葬毫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屡穗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容