POST方法

根據RFC2616,對POST的解釋如下:POST方法用來向目的服務器發出請求,要求它接受被附在請求后的實體,并把它當作請求隊列(Request-Line)中請求URI所指定資源的附加新子項。POST被設計成用統一的方法實現下列功能:

對現有資源的注釋(Annotation??of??existing??resources)??
向電子公告欄、新聞組,郵件列表或類似討論組發送消息??
提交數據塊,如將表單的結果提交給數據處理過程??
通過附加操作來擴展數據庫
調用HttpClient中的PostMethod與GetMethod類似,除了設置PostMethod的實例與GetMethod有些不同之外,剩下的步驟都差不多。在下面的例子中,省去了與GetMethod相同的步驟,只說明與上面不同的地方,并以登錄清華大學BBS為例子進行說明。

構造PostMethod之前的步驟都相同,與GetMethod一樣,構造PostMethod也需要一個URI參數,在本例中,登錄的地址是http://www.newsmth.net/bbslogin2.php。在創建了PostMethod的實例之后,需要給method實例填充表單的值,在BBS的登錄表單中需要有兩個域,第一個是用戶名(域名叫id),第二個是密碼(域名叫passwd)。表單中的域用類NameValuePair來表示,該類的構造函數第一個參數是域名,第二參數是該域的值;將表單所有的值設置到PostMethod中用方法setRequestBody。另外由于BBS登錄成功后會轉向另外一個頁面,但是HttpClient對于要求接受后繼服務的請求,比如POST和PUT,不支持自動轉發,因此需要自己對頁面轉向做處理。具體的頁面轉向處理請參見下面的"自動轉向"部分。代碼如下:??
String??url??=??"http://www.newsmth.net/bbslogin2.php";?
PostMethod??postMethod??
=??new??PostMethod(url);?
//??填入各個表單域的值?
NameValuePair[]??data??=??{??new??NameValuePair("id",??"youUserName"),?
new??NameValuePair("passwd",??"yourPwd")??}
;?
//??將表單的值放入postMethod中?
postMethod.setRequestBody(data);?
//??執行postMethod?
int??statusCode??=??httpClient.executeMethod(postMethod);?
//??HttpClient對于要求接受后繼服務的請求,象POST和PUT等不能自動處理轉發?
//??301或者302?
if??(statusCode??==??HttpStatus.SC_MOVED_PERMANENTLY??||???
statusCode??
==??HttpStatus.SC_MOVED_TEMPORARILY)??{?
????????
//??從頭中取出轉向的地址?
????????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;?
}
?