日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

BlogJava - lostfire - httpclient 3.0初步研究

 fantongx 2006-06-22

httpclient 3.0初步研究

最近一直試圖用httpClient做點自動化的工作,不過現(xiàn)在看來并沒有想象中的那么輕松。
實際上登錄一個網(wǎng)站,訪問某個特點的頁面,發(fā)表一篇文章,上傳一些文件,并不是一個簡單的事情。
HttpClient的基本使用因為發(fā)布的代碼中帶有幾個例子,應該算是不難掌握的事情。下面我說下我遇到的幾個問題。

1,登陸驗證圖片問題
首先登錄的時候網(wǎng)站如果不想你對它編程的化通常都會設計一個驗證圖片,這個技術現(xiàn)在已經(jīng)如此的易于使用,以至于隨便到哪里都能找到代碼來直接使用。對于驗證圖片的,現(xiàn)在還苦于無計可施狀態(tài)。

2,笨蛋Cookie問題:
如果你要發(fā)送多個cookie,其實可以這樣發(fā)的:
state.addCookies (new Cookie[]{
            
new Cookie(" www.aaa.com","popped","yes","/",new Date(2006,12,8),false), 
            
new Cookie(" www.aaa.com","rtime","2","/",new Date(2006,12,8),false), 
            
new Cookie(" www.aaa.com","ltime","1149940477953","/",new Date(2006,12,8),false), 
            
new Cookie(" www.aaa.com ","cnzz02","1","/",new Date(2006,12,8),false),
        }
);

但是截包就會發(fā)現(xiàn),httpclient會在header里構件多個cookie項,每一項只含有一個cookie,這同IE是不一樣的。IE和Firefox會把所有的cookie打包成一個,然后在這個cookie里按照分號把每一項隔開,中間有個空格。
所以如果用httpclient,還想讓cookie正常的話,請使用下面這種形式:

String cookies = "yes; rtime=2; ltime=1149940477953; cnzz02=1"
state.addCookie(
new Cookie("blog.aaa.com","poped",cookies,"/",new Date(2006,12,8),false)); 



3,編碼問題:

httpClient處理編碼并不像IE或FireFox那么智能,httpclient記不住上次會話的編碼,這樣如果默認不是ISO-8859-1的話,那都要在Content-Type里邊指定,其實指定的方法也很簡單。
本來要提交的是form,默認按照application/x-www-form-urlencoded來發(fā)送,在IE里邊發(fā)送的話截包可以看到,報文中也就指定了這樣一個Content-Type,但是人家IE已經(jīng)把報文的內(nèi)容按照會話的編碼轉換好了。而httpclient不行,它并不知道怎么轉化,那么你沒有設定轉換的charset的話,它就按照Charset=ISO-8859-1轉換了。這一點上Httpclient應該再改進一下,因為記住server發(fā)過來的頁面編碼是件很簡單的事情。只要將類似于"Content-Type: text/html; charset=utf-8"這樣的頭保存一下狀態(tài)就可以了。
為了彌補httpclient這一點的傻瓜表現(xiàn),我們只好每次都手工設置一下嘍:
postMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");

4,上傳文件問題:
 
httpClient并不能很好的模擬文件上傳。
首先是對于文件類型的識別,IE可以做到按照文件類型分別選擇不同的Content-type進行發(fā)送,而httpclient就需要我們自己設定,這樣如果對一個目錄進行自動化上傳的話就必須知道該目錄下所有文件的類型,以及對應的charset,然后再設置FilePart的時候逐一判斷文件擴展名,以賦給不同的content-type和charset,對于一些網(wǎng)頁編碼是gb2312,而另外一些網(wǎng)頁編碼是utf-8則會更加麻煩。
其次是如果發(fā)送的multiPartPost報文中除了FilePart以外,還需要一些form中的其他input的信息,又是一件很麻煩的事情。剛開始的時候我以為像一般的PostMethod一樣,使用PostMethod.addParameters()就可以了,后來才發(fā)現(xiàn)這個 MultiPartPost跟那個Post根本就是兩個不同的Post。雖然從網(wǎng)頁上看都是Form,且只是在input的類型上 MultiPartPost包含一個file類型的input,其他完全一樣,但實際上在httpClient中是完全不同的兩套方案。對于MultiPartPost而言,不能用addParameters(),而要使用


someMultiPartPost.setRequestEntity(
     
new MultipartRequestEntity( 
         
new Part[] { art1,part2,part3,part4}
                    someMultiPartPost.getParams())
);


這種形式。對于要上傳的File,那么這些part就是FilePart對象,如果是跟隨form的其他input,那么這些part就是 StringPart。這樣發(fā)出去的報文才是:Content-Disposition: form-data; name="newFolderName"這種形式。


總結起來,其實也不能怪人家HttpClient,天下間哪有那么多容易做到的事情,尤其是面對Http這樣一個說來不算簡單的協(xié)議。
實際上像這種開源已久的東西,已經(jīng)有了不少的文檔,雖然有時候不太好找,但很多問題還是能夠猜或者試出來,畢竟相對比較成熟,而且遵循這rfc來做的。就像我在水母上問問題,有人說的那樣,世界上有什么能模擬的像IE一樣呢,也不能拿IE的標準要求HttpClient。
我現(xiàn)在的感覺是要想用好HttpClient,或者類似的別的什么工具(其他我就不知道了,有知道類似工具的麻煩告訴我一聲),其實還是要把協(xié)議吃透,這樣一旦遇到什么問題,才知道問題出在哪里,否則就只有郁悶的份兒了。
昨天去Apache的網(wǎng)站,看到一個新的Project叫做HttpComponent從common里邊脫離出來,包含了HttpCore, HttpClient,HttpAsync,HttpNIO,HttpCookie,HttpConn,看不出到底想做成什么樣子,不過HttpCore 4.0 alpha2已經(jīng)發(fā)布了,以后HttpClient用起來可能又有新的變化了。

一周的時間,用的不是很多,有說得不妥的地方,還請大家指正。

posted on 2006-06-15 00:12 I like java 閱讀(735) 評論(5)  編輯 收藏 收藏至365Key 所屬分類: http tool

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多