POST方法

根據(jù)RFC2616,對(duì)POST的解釋如下:POST方法用來(lái)向目的服務(wù)器發(fā)出請(qǐng)求,要求它接受被附在請(qǐng)求后的實(shí)體,并把它當(dāng)作請(qǐng)求隊(duì)列(Request-Line)中請(qǐng)求URI所指定資源的附加新子項(xiàng)。POST被設(shè)計(jì)成用統(tǒng)一的方法實(shí)現(xiàn)下列功能:

對(duì)現(xiàn)有資源的注釋?zhuān)ˋnnotation??of??existing??resources)??
向電子公告欄、新聞組,郵件列表或類(lèi)似討論組發(fā)送消息??
提交數(shù)據(jù)塊,如將表單的結(jié)果提交給數(shù)據(jù)處理過(guò)程??
通過(guò)附加操作來(lái)擴(kuò)展數(shù)據(jù)庫(kù)
調(diào)用HttpClient中的PostMethod與GetMethod類(lèi)似,除了設(shè)置PostMethod的實(shí)例與GetMethod有些不同之外,剩下的步驟都差不多。在下面的例子中,省去了與GetMethod相同的步驟,只說(shuō)明與上面不同的地方,并以登錄清華大學(xué)BBS為例子進(jìn)行說(shuō)明。

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