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
二.特性
- 基于標(biāo)準(zhǔn)漱竖、純凈的Java語(yǔ)言。實(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é)議馍惹。
- 通過(guò)Http代理建立透明的連接。
- 利用CONNECT方法通過(guò)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)閉過(guò)期的連接薪丁。
- 自動(dòng)處理Set-Cookie中的Cookie。
- 插件式的自定義Cookie策略馅精。
- Request的輸出流可以避免流中內(nèi)容直接緩沖到socket服務(wù)器严嗜。
- Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容。
- 在http1.0和http1.1中利用KeepAlive保持持久連接洲敢。
- 直接獲取服務(wù)器發(fā)送的response code和 headers漫玄。
- 設(shè)置連接超時(shí)的能力。
- 實(shí)驗(yàn)性的支持http1.1 response caching压彭。
- 源代碼基于Apache License 可免費(fèi)獲取睦优。
三.使用方法
使用HttpClient發(fā)送請(qǐng)求、接收響應(yīng)很簡(jiǎn)單哮塞,一般需要如下幾步即可刨秆。
- 創(chuàng)建HttpClient對(duì)象。
- 創(chuàng)建請(qǐng)求方法的實(shí)例忆畅,并指定請(qǐng)求URL衡未。如果需要發(fā)送GET請(qǐng)求尸执,創(chuàng)建HttpGet對(duì)象;如果需要發(fā)送POST請(qǐng)求缓醋,創(chuàng)建HttpPost對(duì)象如失。
- 如果需要發(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ù)抗俄。
- 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求脆丁,該方法返回一個(gè)HttpResponse。
- 調(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)容歼培。
- 釋放連接。無(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();
}
}
}