HttpClient使用詳解與實(shí)戰(zhàn)一:普通的GET和POST請(qǐng)求

簡介

HttpClient是Apache Jakarta Common下的子項(xiàng)目薄料,用來提供高效的、最新的盆繁、功能豐富的支持HTTP協(xié)議的客戶端編程工具包秩铆,并且它支持HTTP協(xié)議最新的版本和建議。
HttpClient最新版本是HttpClient 4.5.3 (GA)曾棕。
官方下載:http://hc.apache.org/downloads.cgi

主要特性

  • 基于標(biāo)準(zhǔn)扣猫、純凈的Java語言,實(shí)現(xiàn)了HTTP1.0和HTTP1.1翘地。
  • 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實(shí)現(xiàn)了HTTP全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)申尤。
  • 支持加密的HTTPS協(xié)議(HTTP通過SSL協(xié)議)。
  • 通過HTTP代理方式建立透明的連接衙耕。
  • 利用CONNECT方法通過HTTP代理建立隧道的HTTPS連接昧穿。
  • Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案。
  • 插件式的自定義認(rèn)證方案橙喘。
  • 可插拔的安全套接字工廠时鸵,使得接入第三方解決方案變得更容易
  • 連接管理支持使用多線程的的應(yīng)用。支持設(shè)置最大連接數(shù)厅瞎,同時(shí)支持設(shè)置每個(gè)主機(jī)的最大連接數(shù)饰潜,發(fā)現(xiàn)并關(guān)閉過期的連接初坠。
  • 自動(dòng)化處理Set-Cookie:來自服務(wù)器的頭,并在適當(dāng)?shù)臅r(shí)候?qū)⑺鼈儼l(fā)送回cookie囊拜。
  • 可以自定義Cookie策略的插件化機(jī)制某筐。
  • Request的輸出流可以避免流中內(nèi)容體直接從socket緩沖到服務(wù)器。
  • Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容冠跷。
  • 在HTTP1.0和HTTP1.1中使用用KeepAlive來保持持久連接南誊。
  • 可以直接獲取服務(wù)器發(fā)送的響應(yīng)碼和響應(yīng)頭部。
  • 具備設(shè)置連接超時(shí)的能力蜜托。
  • 支持HTTP/1.1 響應(yīng)緩存抄囚。
  • 源代碼基于Apache License 可免費(fèi)獲取。

一般使用步驟

使用HttpClient發(fā)送請(qǐng)求橄务、接收響應(yīng)幔托,一般需要以下步驟。
HttpGet請(qǐng)求響應(yīng)的一般步驟:
1). 創(chuàng)建HttpClient對(duì)象,可以使用HttpClients.createDefault()蜂挪;
2). 如果是無參數(shù)的GET請(qǐng)求重挑,則直接使用構(gòu)造方法HttpGet(String url)創(chuàng)建HttpGet對(duì)象即可;
如果是帶參數(shù)GET請(qǐng)求棠涮,則可以先使用URIBuilder(String url)創(chuàng)建對(duì)象谬哀,再調(diào)用addParameter(String param, String value),或setParameter(String param, String value)來設(shè)置請(qǐng)求參數(shù)严肪,并調(diào)用build()方法構(gòu)建一個(gè)URI對(duì)象史煎。只有構(gòu)造方法HttpGet(URI uri)來創(chuàng)建HttpGet對(duì)象。
3). 創(chuàng)建HttpResponse驳糯,調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求篇梭,該方法返回一個(gè)HttpResponse。調(diào)用HttpResponsegetAllHeaders()酝枢、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭恬偷;調(diào)用HttpResponsegetEntity()方法可獲取HttpEntity對(duì)象,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容帘睦。程序可通過該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容袍患。通過調(diào)用getStatusLine().getStatusCode()可以獲取響應(yīng)狀態(tài)碼。
4). 釋放連接官脓。

HttpPost請(qǐng)求響應(yīng)的一般步驟:
1). 創(chuàng)建HttpClient對(duì)象,可以使用HttpClients.createDefault()
2). 如果是無參數(shù)的GET請(qǐng)求涝焙,則直接使用構(gòu)造方法HttpPost(String url)創(chuàng)建HttpPost對(duì)象即可卑笨;
如果是帶參數(shù)POST請(qǐng)求,先構(gòu)建HttpEntity對(duì)象并設(shè)置請(qǐng)求參數(shù)仑撞,然后調(diào)用setEntity(HttpEntity entity)創(chuàng)建HttpPost對(duì)象赤兴。
3). 創(chuàng)建HttpResponse妖滔,調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求,該方法返回一個(gè)HttpResponse桶良。調(diào)用HttpResponsegetAllHeaders()座舍、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponsegetEntity()方法可獲取HttpEntity對(duì)象陨帆,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容曲秉。程序可通過該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。通過調(diào)用getStatusLine().getStatusCode()可以獲取響應(yīng)狀態(tài)碼疲牵。
4). 釋放連接承二。

實(shí)例代碼實(shí)戰(zhàn)

構(gòu)建一個(gè)Maven項(xiàng)目,引入如下依賴

<dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>

實(shí)例1:普通的無參數(shù)GET請(qǐng)求

打開一個(gè)url纲爸,抓取響應(yīng)結(jié)果輸出成html文件

/**
 *普通的GET請(qǐng)求
 */
public class DoGET {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建Httpclient對(duì)象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 創(chuàng)建http GET請(qǐng)求
        HttpGet httpGet = new HttpGet("http://www.baidu.com");
        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請(qǐng)求
            response = httpclient.execute(httpGet);
            // 判斷返回狀態(tài)是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                //請(qǐng)求體內(nèi)容
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                //內(nèi)容寫入文件
                FileUtils.writeStringToFile(new File("E:\\devtest\\baidu.html"), content, "UTF-8");
                System.out.println("內(nèi)容長度:"+content.length());
            }
        } finally {
            if (response != null) {
                response.close();
            }
            //相當(dāng)于關(guān)閉瀏覽器
            httpclient.close();
        }
    }
}

實(shí)例2:執(zhí)行帶參數(shù)的GET請(qǐng)求

模擬使用百度搜索關(guān)鍵字"java",并保存搜索結(jié)果為html文件

import java.io.File;
import java.net.URI;
import org.apache.commons.io.FileUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
/**
 * 帶參數(shù)的GET請(qǐng)求
 * 兩種方式:
 *       1.直接將參數(shù)拼接到url后面 如:?wd=java
 *       2.使用URI的方法設(shè)置參數(shù) setParameter("wd", "java")
 */
public class DoGETParam {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建Httpclient對(duì)象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 定義請(qǐng)求的參數(shù)
        URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();
        // 創(chuàng)建http GET請(qǐng)求
        HttpGet httpGet = new HttpGet(uri);
        //response 對(duì)象
        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行http get請(qǐng)求
            response = httpclient.execute(httpGet);
            // 判斷返回狀態(tài)是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                //內(nèi)容寫入文件
                FileUtils.writeStringToFile(new File("E:\\devtest\\baidu-param.html"), content, "UTF-8");
                System.out.println("內(nèi)容長度:"+content.length());
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}

實(shí)例3:執(zhí)行普通的POST請(qǐng)求

無參數(shù)的POST請(qǐng)求亥鸠,并設(shè)置Header來偽裝瀏覽器請(qǐng)求

import org.apache.commons.io.FileUtils;
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.util.EntityUtils;

import java.io.File;

/**
 * 常規(guī)post請(qǐng)求
 *    可以設(shè)置Header來偽裝瀏覽器請(qǐng)求
 */
public class DoPOST {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建Httpclient對(duì)象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 創(chuàng)建http POST請(qǐng)求
        HttpPost httpPost = new HttpPost("http://www.oschina.net/");
        //偽裝瀏覽器請(qǐng)求
        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請(qǐng)求
            response = httpclient.execute(httpPost);
            // 判斷返回狀態(tài)是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                //內(nèi)容寫入文件
                FileUtils.writeStringToFile(new File("E:\\devtest\\oschina.html"), content, "UTF-8");
                System.out.println("內(nèi)容長度:"+content.length());
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}

實(shí)例4:執(zhí)行帶參數(shù)的POST請(qǐng)求

模擬開源中國檢索java,并偽裝瀏覽器請(qǐng)求识啦,輸出響應(yīng)結(jié)果為html文件


檢索java
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.http.NameValuePair;
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;

/**
 * 帶有參數(shù)的Post請(qǐng)求
 * NameValuePair
 */
public class DoPOSTParam {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建Httpclient對(duì)象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 創(chuàng)建http POST請(qǐng)求
        HttpPost httpPost = new HttpPost("http://www.oschina.net/search");
        // 設(shè)置2個(gè)post參數(shù)负蚊,一個(gè)是scope、一個(gè)是q
        List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
        parameters.add(new BasicNameValuePair("scope", "project"));
        parameters.add(new BasicNameValuePair("q", "java"));
        // 構(gòu)造一個(gè)form表單式的實(shí)體
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
        // 將請(qǐng)求實(shí)體設(shè)置到httpPost對(duì)象中
        httpPost.setEntity(formEntity);
        //偽裝瀏覽器
        httpPost.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        CloseableHttpResponse response = null;
        try {
            // 執(zhí)行請(qǐng)求
            response = httpclient.execute(httpPost);
            // 判斷返回狀態(tài)是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                //內(nèi)容寫入文件
                FileUtils.writeStringToFile(new File("E:\\devtest\\oschina-param.html"), content, "UTF-8");
                System.out.println("內(nèi)容長度:"+content.length());
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}

總結(jié)

本文介紹了HttpClient的特性颓哮,是按照官方英文文檔翻譯而來家妆,然后分別介紹了HttpGet和HttpPost的一般使用步驟,最后給出了4個(gè)簡單的實(shí)例的Java代碼题翻。下一章節(jié)我們會(huì)介紹HttpClient連接池管理以及Spring整合HttpClient的具體過程揩徊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嵌赠,隨后出現(xiàn)的幾起案子塑荒,更是在濱河造成了極大的恐慌,老刑警劉巖姜挺,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿税,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炊豪,警方通過查閱死者的電腦和手機(jī)凌箕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來词渤,“玉大人牵舱,你說我怎么就攤上這事∪迸埃” “怎么了芜壁?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我慧妄,道長顷牌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任塞淹,我火速辦了婚禮窟蓝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饱普。我一直安慰自己运挫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布费彼。 她就那樣靜靜地躺著滑臊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箍铲。 梳的紋絲不亂的頭發(fā)上雇卷,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音颠猴,去河邊找鬼关划。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翘瓮,可吹牛的內(nèi)容都是我干的贮折。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼资盅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼调榄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呵扛,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤每庆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后今穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤灵,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蓝晒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腮出。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芝薇,死狀恐怖胚嘲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洛二,我是刑警寧澤馋劈,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布立倍,位于F島的核電站,受9級(jí)特大地震影響侣滩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜变擒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一君珠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娇斑,春花似錦策添、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苦丁,卻和暖如春浸颓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旺拉。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工产上, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛾狗。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓晋涣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沉桌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谢鹊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,957評(píng)論 6 13
  • apache下的httpclient工具可大大簡化開發(fā)過程中的點(diǎn)對(duì)點(diǎn)通信,本人將以微信多媒體接口為例留凭,展示http...
    劃破的天空閱讀 5,287評(píng)論 0 32
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理佃扼,服務(wù)發(fā)現(xiàn),斷路器冰抢,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • HttpClient是Apache Jakarta Common下的子項(xiàng)目松嘶,用來提供高效的、最新的挎扰、功能豐富的支持...
    剽悍一只雞閱讀 3,330評(píng)論 1 1
  • 在我安靜且兵荒馬亂的青春里翠订,我羨慕過很多事物。先申明一點(diǎn)遵倦,羨慕是個(gè)中性詞尽超。 我羨慕擁有極好人緣的人。他...
    9nine閱讀 296評(píng)論 0 1