最近一直試圖用httpclient做點自動化的工作
,不過現在看來並沒有想象中的那麼輕鬆。
實際上登入乙個**,訪問某個特點的頁面,發表一篇文章,上傳一些檔案,並不是乙個簡單的事情。
httpclient的基本使用因為發布的**中帶有幾個例子,應該算是不難掌握的事情。下面我說下我遇到的幾個問題。
1,登陸驗證問題
2,笨蛋cookie問題:
如果你要傳送多個cookie,其實可以這樣發的:
newcookie
);
但是截包就會發現,httpclient會在header裡構件多個cookie項,每一項只含有乙個cookie,這同ie是不一樣的。ie和firefox會把所有的cookie打包成乙個,然後在這個cookie裡按照分號把每一項隔開,中間有個空格。
所以如果用httpclient,還想讓cookie正常的話,請使用下面這種形式:
yes; rtime=2; ltime=1149940477953; cnzz02=1";
newcookie(
"blog.aaa.com",
"poped
",cookies,"/
",newdate(
2006,12
,8),false
));
3,編碼問題:
httpclient處理編碼並不像ie或firefox那麼智慧型,httpclient記不住上次會話的編碼,這樣如果預設不是iso-8859-1的話,那都要在content-type裡邊指定,其實指定的方法也很簡單。
為了彌補httpclient這一點的傻瓜表現,我們只好每次都手工設定一下嘍:
4,上傳檔案問題:
httpclient並不能很好的模擬檔案上傳。
首先是對於檔案型別的識別,ie可以做到按照檔案型別分別選擇不同的content-type進行傳送,而httpclient就需要我們自己設定,這樣如果對乙個目錄進行自動化上傳的話就必須知道該目錄下所有檔案的型別,以及對應的charset,然後再設定filepart的時候逐一判斷副檔名,以賦給不同的content-type和charset,對於一些網頁編碼是gb2312,而另外一些網頁編碼是utf-8則會更加麻煩。
其次是如果傳送的multipartpost報文中除了filepart以外,還需要一些form中的其他input的資訊,又是一件很麻煩的事情。剛開始的時候我以為像一般的postmethod一樣,使用postmethod.addparameters()就可以了,後來才發現這個 multipartpost跟那個post根本就是兩個不同的post。雖然從網頁上看都是form,且只是在input的型別上 multipartpost包含乙個file型別的input,其他完全一樣,但實際上在httpclient中是完全不同的兩套方案。對於multipartpost而言,不能用addparameters(),而要使用
newmultipartrequestentity(
newpart
, somemultipartpost.getparams())
);
這種形式。對於要上傳的file,那麼這些part就是filepart物件,如果是跟隨form的其他input,那麼這些part就是 stringpart。這樣發出去的報文才是:content-disposition: form-data; name="newfoldername"這種形式。
總結起來,其實也不能怪人家httpclient,天下間哪有那麼多容易做到的事情,尤其是面對http這樣乙個說來不算簡單的協議。
實際上像這種開源已久的東西,已經有了不少的文件,雖然有時候不太好找,但很多問題還是能夠猜或者試出來,畢竟相對比較成熟,而且遵循這rfc來做的。就像我在水母上問問題,有人說的那樣,世界上有什麼能模擬的像ie一樣呢,也不能拿ie的標準要求httpclient。
我現在的感覺是要想用好httpclient,或者類似的別的什麼工具(其他我就不知道了,有知道類似工具的麻煩告訴我一聲),其實還是要把協議吃透,這樣一旦遇到什麼問題,才知道問題出在**,否則就只有鬱悶的份兒了。
昨天去apache的**,看到乙個新的project叫做httpcomponent從common裡邊脫離出來,包含了httpcore, httpclient,httpasync,httpnio,httpcookie,httpconn,看不出到底想做成什麼樣子,不過httpcore 4.0 alpha2已經發布了,以後httpclient用起來可能又有新的變化了。
一周的時間,用的不是很多,有說得不妥的地方,還請大家指正
kenty
初步使用HttpClient
剛剛使用httpclient想稍微的總結一下。發現引入最新版本4.5,defaulthttpclient等老版本常用的類已經過時了,不推薦使用了 去官網看了一下在4.3之後就拋棄了。官方推薦使用 defaulthttpclient closeablehttpclient 使用get請求方式,post...
HttpClient學習筆記
httpclient程式設計的基本步聚 建立 httpclient 的乙個例項.建立某個方法 deletemethod,entityenclosingmethod,expectcontinuemethod,getmethod,headmethod,multipartpostmethod,option...
httpclient 學習筆記
前陣子,學習了一下apache 的httpclient,感覺httpclient還是比較好用的,就是傳輸漢字的時候有預設的編碼問題。在使用 httpclient.executemethod postmethod 時,httpclient會呼叫 protected requestentity gene...