一、簡介
HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個開源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient。
二、特性
- 基于標(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代理建立透明的連接。
- 利用CONNECT方法通過Http代理建立隧道的https連接。
- Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案。
- 插件式的自定義認(rèn)證方案。
- 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
- 連接管理器支持多線程應(yīng)用。支持設(shè)置最大連接數(shù),同時支持設(shè)置每個主機(jī)的最大連接數(shù),發(fā)現(xiàn)并關(guān)閉過期的連接。
- 自動處理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í)驗(yàn)性的支持http1.1 response caching。
- 源代碼基于Apache License 可免費(fèi)獲取。
三、使用
使用HttpClient發(fā)送請求、接收響應(yīng)很簡單,一般需要如下幾步即可。
- 創(chuàng)建HttpClient對象。
- 創(chuàng)建請求方法的實(shí)例,并指定請求URL。如果需要發(fā)送GET請求,創(chuàng)建HttpGet對象;如果需要發(fā)送POST請求,創(chuàng)建HttpPost對象。
- 如果需要發(fā)送請求參數(shù),可調(diào)用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數(shù);對于HttpPost對象而言,也可調(diào)用setEntity(HttpEntity entity)方法來設(shè)置請求參數(shù)。
- 調(diào)用HttpClient對象的execute(HttpUriRequest request)發(fā)送請求,該方法返回一個HttpResponse。
- 調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過該對象獲取服務(wù)器的響應(yīng)內(nèi)容。
- 釋放連接。無論執(zhí)行方法是否成功,都必須釋放連接
Get請求使用方法
public void get(View view) {
new Thread() {
public void run() {
try {
// 創(chuàng)建請求發(fā)送對象HttpClient
HttpClient client = new DefaultHttpClient();
// 創(chuàng)建get
String url = "http://www.baidu.com";
HttpGet get = new HttpGet(url);
// 服務(wù)端返回數(shù)據(jù)
HttpResponse response = client.execute(get);// 發(fā)送 沒有封裝線程的對象
// 就不需要回調(diào)
InputStream input = response.getEntity().getContent();
byte[] data = StreamUtils.readInputStream(input);
String result = new String(data, "utf-8");
Log.i("wzx", result);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
Psot()
public void post(View view) {
new Thread() {
public void run() {
try {
// 創(chuàng)建請求發(fā)送對象HttpClient
HttpClient client = new DefaultHttpClient();
// 創(chuàng)建post
String url = "http://192.168.32.10:8080/web/LoginServlet";
HttpPost post = new HttpPost(url);
// 變量 NameValuePair:Map.Entry
NameValuePair username = new BasicNameValuePair("username", "中國ujj");
NameValuePair passowrd = new BasicNameValuePair("password", "中國ujj");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(username);
params.add(passowrd);
UrlEncodedFormEntity form = new UrlEncodedFormEntity(params, "utf-8");
post.setEntity(form);// 添加表單到請求里,帶到服務(wù)端
// 服務(wù)端返回數(shù)據(jù)
HttpResponse response = client.execute(post);// 發(fā)送 沒有封裝線程的對象
InputStream input = response.getEntity().getContent();
byte[] data = StreamUtils.readInputStream(input);
String result = new String(data, "utf-8");
Log.i("wzx", result);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}