apache httpclient不多介紹這個(gè)工具是什么碱妆,具體請(qǐng)看官網(wǎng),不贅述蜘拉。
進(jìn)行記錄的原因一個(gè)是把掉過坑的地方記住嘹裂,另一個(gè)是自httpclient-4.4開始市框,官方對(duì)代碼進(jìn)行了很多調(diào)整疗隶,4.4以前的很多class和method都過時(shí)了佑笋,而國內(nèi)之前很多關(guān)于httpclient的分享都是4.4之前的。
個(gè)人感覺使用Httpclient比較重要的是看它的代碼抽减,和官方的一些例子允青,可能是網(wǎng)絡(luò)知識(shí)比較短板的原因,官方的tutorial其實(shí)看起來挺不清晰的卵沉,感覺主線不明確颠锉,不能引導(dǎo)你很好的學(xué)習(xí),建議初學(xué)的人同時(shí)結(jié)合官網(wǎng)史汗、源碼琼掠、官方例子、tutorial進(jìn)行學(xué)習(xí)停撞。
先看第一個(gè)demo瓷蛙,把這個(gè)東西用起來再說。
/**
* 使用httpclient-4.5.2發(fā)送請(qǐng)求
* @author chmod400
* 2016.3.24
*/
public class FirstHttpClientDemo {
public static void main(String[] args) {
try {
String url = "http://www.baidu.com";
// 使用默認(rèn)配置創(chuàng)建httpclient的實(shí)例
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
// HttpGet get = new HttpGet(url);
CloseableHttpResponse response = client.execute(post);
// CloseableHttpResponse response = client.execute(get);
// 服務(wù)器返回碼
int status_code = response.getStatusLine().getStatusCode();
System.out.println("status_code = " + status_code);
// 服務(wù)器返回內(nèi)容
String respStr = null;
HttpEntity entity = response.getEntity();
if(entity != null) {
respStr = EntityUtils.toString(entity, "UTF-8");
}
System.out.println("respStr = " + respStr);
// 釋放資源
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
}
這個(gè)demo主要是完成基本的交互過程戈毒,發(fā)送請(qǐng)求艰猬,接收消息,如果只是做小程序或者不是特別大并發(fā)量的系統(tǒng)埋市,基本已經(jīng)夠用了冠桃。
進(jìn)行一些說明:
1.需要向服務(wù)器發(fā)送請(qǐng)求,我們需要一個(gè)org.apache.http.client.HttpClient
的實(shí)例對(duì)象道宅,一般使用的都是org.apache.http.impl.client.CloseableHttpClient
食听,創(chuàng)建該對(duì)象的最簡單方法是CloseableHttpClient client = HttpClients.createDefault();
,HttpClients是負(fù)責(zé)創(chuàng)建CloseableHttpClient的工廠,現(xiàn)在我們用最簡單的方法就是使用默認(rèn)配置去創(chuàng)建實(shí)例污茵,后面我們再討論有參數(shù)定制需求的實(shí)例創(chuàng)建方法樱报。我們可以通過打斷點(diǎn)的方式看到這個(gè)默認(rèn)的實(shí)例對(duì)象的連接管理器 : org.apache.http.conn.HttpClientConnectionManager
、請(qǐng)求配置 : org.apache.http.client.config.RequestConfig
等配置的默認(rèn)參數(shù)泞当,這些都是后面需要了解的迹蛤。
2.構(gòu)造請(qǐng)求方法HttpPost post = new HttpPost(url);
表示我們希望用那種交互方法與服務(wù)器交互,HttpClient為每種交互方法都提供了一個(gè)類:HttpGet,
HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, 還有 HttpOptions。
3.向服務(wù)器提交請(qǐng)求CloseableHttpResponse response = client.execute(post);
笤受,很明顯`CloseableHttpResponse就是用了處理返回?cái)?shù)據(jù)的實(shí)體穷缤,通過它我們可以拿到返回的狀態(tài)碼、返回實(shí)體等等我們需要的東西箩兽。
4.EntityUtils是官方提供一個(gè)處理返回實(shí)體的工具類,toString方法負(fù)責(zé)將返回實(shí)體裝換為字符串章喉,官方是不太建議使用這個(gè)類的汗贫,除非返回?cái)?shù)據(jù)的服務(wù)器絕對(duì)可信和返回的內(nèi)容長度是有限的。官方建議是自己使用HttpEntity#getContent()或者HttpEntity#writeTo(OutputStream)秸脱,需要提醒的是記得關(guān)閉底層資源落包。
5.EntityUtils.consume(entity);
負(fù)責(zé)釋放資源,通過源碼可知摊唇,是需要把底層的流關(guān)閉:
InputStream instream = entity.getContent();
if (instream != null) {
instream.close();
}
好了咐蝇,到此已經(jīng)完成了httpclient的第一個(gè)demo。
jar包地址:Apache HttpClient 4.5.2巷查、Apache HttpCore 4.4