使用HttpClient過程中常見的一些問題

cow977發表於2011-04-29
下面介紹在使用HttpClient過程中常見的一些問題。
字元編碼
某目標頁的編碼可能出現在兩個地方,第一個地方是伺服器返回的http頭中,另外一個地方是得到的html/xml頁面中。
•在http頭的Content-Type欄位可能會包含字元編碼資訊。例如可能返回的頭會包含這樣子的資訊:Content-Type: text/html; charset=UTF-8。這個頭資訊表明該頁的編碼是UTF-8,但是伺服器返回的頭資訊未必與內容能匹配上。比如對於一些雙位元組語言國家,可能伺服器返回的編碼型別是UTF-8,但真正的內容卻不是UTF-8編碼的,因此需要在另外的地方去得到頁面的編碼資訊;但是如果伺服器返回的編碼不是UTF-8,而是具體的一些編碼,比如gb2312等,那伺服器返回的可能是正確的編碼資訊。透過method物件的getResponseCharSet()方法就可以得到http頭中的編碼資訊。
•對於象xml或者html這樣的檔案,允許作者在頁面中直接指定編碼型別。比如在html中會有這樣的標籤;或者在xml中會有這樣的標籤,在這些情況下,可能與http頭中返回的編碼資訊衝突,需要使用者自己判斷到底那種編碼型別應該是真正的編碼。
自動轉向
根據RFC2616中對自動轉向的定義,主要有兩種:301和302。301表示永久的移走(Moved Permanently),當返回的是301,則表示請求的資源已經被移到一個固定的新地方,任何向該地址發起請求都會被轉到新的地址上。302表示暫時的轉向,比如在伺服器端的servlet程式呼叫了sendRedirect方法,則在客戶端就會得到一個302的程式碼,這時伺服器返回的頭資訊中location的值就是sendRedirect轉向的目標地址。
HttpClient支援自動轉向處理,但是象POST和PUT方式這種要求接受後繼服務的請求方式,暫時不支援自動轉向,因此如果碰到POST方式提交後返回的是301或者302的話需要自己處理。就像剛才在POSTMethod中舉的例子:如果想進入登入BBS後的頁面,必須重新發起登入的請求,請求的地址可以在頭欄位location中得到。不過需要注意的是,有時候location返回的可能是相對路徑,因此需要對location返回的值做一些處理才可以發起向新地址的請求。
另外除了在頭中包含的資訊可能使頁面發生重定向外,在頁面中也有可能會發生頁面的重定向。引起頁面自動轉發的標籤是:。如果你想在程式中也處理這種情況的話得自己分析頁面來實現轉向。需要注意的是,在上面那個標籤中url的值也可以是一個相對地址,如果是這樣的話,需要對它做一些處理後才可以轉發。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-694104/,如需轉載,請註明出處,否則將追究法律責任。

相關文章