參考http://www.ibm.com/developerworks/cn/opensource/os-httpclient/,以備個人學(xué)習(xí)所用
HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。
HttpClient 提供的主要的功能:
- 實現(xiàn)了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
- 支持自動轉(zhuǎn)向
- 支持 HTTPS 協(xié)議
- 支持代理服務(wù)器等
HttpClient 基本功能的使用
GET 方法
使用 HttpClient 需要以下 6 個步驟:
1. 創(chuàng)建 HttpClient 的實例
HttpClient httpClient = new HttpClient();
2. 創(chuàng)建某種連接方法的實例,在這里是 GetMethod。在 GetMethod 的構(gòu)造函數(shù)中傳入待連接的地址
GetMethod getMethod = new GetMethod("http://www.tom.com/");
3. 調(diào)用第一步中創(chuàng)建好的實例的 execute 方法來執(zhí)行第二步中創(chuàng)建好的 method 實例
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode ==HttpStatus.SC_OK) 則說明成功了
4. 讀 response
byte[] responseBody = method.getResponseBody();
String responseBody = method.getResponseBodyAsString();
5. 釋放連接。無論執(zhí)行方法是否成功,都必須釋放連接
method.releaseConnection();
6. 對得到后的內(nèi)容進(jìn)行處理
POST方法
根據(jù)RFC2616,對POST的解釋如下:POST方法用來向目的服務(wù)器發(fā)出請求,要求它接受被附在請求后的實體,并把它當(dāng)作請求隊列(Request-Line)中請求URI所指定資源的附加新子項。POST被設(shè)計成用統(tǒng)一的方法實現(xiàn)下列功能:
- 對現(xiàn)有資源的注釋(Annotation of existing resources)
- 向電子公告欄、新聞組,郵件列表或類似討論組發(fā)送消息
- 提交數(shù)據(jù)塊,如將表單的結(jié)果提交給數(shù)據(jù)處理過程
- 通過附加操作來擴(kuò)展數(shù)據(jù)庫
調(diào)用HttpClient中的PostMethod與GetMethod類似,除了設(shè)置PostMethod的實例與GetMethod有些不同之外,剩下的步驟都差不多。
注意:
(1)表單中的域用類NameValuePair來表示,該類的構(gòu)造函數(shù)第一個參數(shù)是域名,第二參數(shù)是該域的值
(2)將表單所有的值設(shè)置到PostMethod中用方法setRequestBody
(3)HttpClient對于要求接受后繼服務(wù)的請求,比如POST和PUT,不支持自動轉(zhuǎn)發(fā),因此需要自己對頁面轉(zhuǎn)向做處理
(4)301表示永久的移走(Moved Permanently),當(dāng)返回的是301,則表示請求的資源已經(jīng)被移到一個固定的新地方,任何向該地址發(fā)起請求都會被轉(zhuǎn)到新的地址上。302表示暫時的轉(zhuǎn)向,比如在服務(wù)器端的servlet程序調(diào)用了sendRedirect方法,則在客戶端就會得到一個302的代碼,這時服務(wù)器返回的頭信息中l(wèi)ocation的值就是sendRedirect轉(zhuǎn)向的目標(biāo)地址。
String url = "http://www.abc.com";
PostMethod postMethod = new PostMethod(url);
NameValuePair[] data = { new NameValuePair("id", "youUserName"),
new NameValuePair("passwd", "yourPwd") };
postMethod.setRequestBody(data);
int statusCode = httpClient.executeMethod(postMethod);
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 從頭中取出轉(zhuǎn)向的地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
System.out.println("The page was redirected to:" + location);
} else {
System.err.println("Location field value is null.");
}
return;
}