<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 23,comments - 66,trackbacks - 0
    by lostfire

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

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

    2,笨蛋Cookie問題:
    如果你要發送多個cookie,其實可以這樣發的:
    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),
    ????????}
    );

    但是截包就會發現,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來發送,在IE里邊發送的話截包可以看到,報文中也就指定了這樣一個Content-Type,但是人家IE已經把報文的內容按照會話的編碼轉換好了。而httpclient不行,它并不知道怎么轉化,那么你沒有設定轉換的charset的話,它就按照Charset=ISO-8859-1轉換了。這一點上Httpclient應該再改進一下,因為記住server發過來的頁面編碼是件很簡單的事情。只要將類似于"Content-Type: text/html; charset=utf-8"這樣的頭保存一下狀態就可以了。
    為了彌補httpclient這一點的傻瓜表現,我們只好每次都手工設置一下嘍:
    postMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");

    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(),而要使用


    someMultiPartPost.setRequestEntity(
    ?????
    new?MultipartRequestEntity(?
    ?????????
    new?Part[]?{?art1,part2,part3,part4},?
    ????????????????????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用起來可能又有新的變化了。

    一周的時間,用的不是很多,有說得不妥的地方,還請大家指正。
    posted on 2006-06-15 00:12 rd2pm 閱讀(9586) 評論(12)  編輯  收藏 所屬分類: http tool

    FeedBack:
    # re: httpclient 3.0初步研究
    2006-06-15 08:51 | Dedian
    hehe, 我也想利用Httpclient做一些到名人的博克上搶沙發的事,可惜并不是那么簡單。anyway,關注你的研究。  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-06-15 15:59 | Compass
    blogjava的驗證碼是放在cookie里面的,可以用httpclient來搶沙發  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-06-16 00:59 | I like java
    @Compass
    blogjava有驗證碼么?  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-06-16 10:37 | Compass
    @I like java

    匿名發表評論需要驗證碼  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-06-16 16:00 | steeven
    沙發和飛機是有關系的  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-07-09 15:32 | pysh@163.com
    驗證碼問題,可以找javaocr來解決。  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-07-09 15:43 | pysh@163.com
    用httpclient來get操作很簡單,但應該注意把httpclient利用它提供的ConnectionManager管理起來。
    用來post操作是一件麻煩的事情。

    cookie基本上不是問題。設置兼容的CookiePolicy即可

    post的值要全面,一般來說,把需要post的頁面先get下來,把各個field的值 set到需要post的頁面上會減輕很多工作。

    但很多網站很刁難的進行了許多其他工作,逐個的分析太煩人的。如果您能對donews的blog利用httpclient維護。歡迎賜教。





      回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-07-09 18:21 | lostfire
    @pysh@163.com
    我就是對donews做了一個小實驗,發現上邊提到的cookie的問題的,不過后來采用我上邊提到的urgly的方法已經可以對donews做發文操作了。
    這兩天在做另外一個實驗的時候,發現這個Cookie的問題并不總是會出現,但會有其他的問題,可能是我對.net做網站的方法了解太少的原因吧。  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-07-31 15:09 | air
    我想請教一下, 當 get 所得回來的數據含有 multi-part 時, 甚至是有多個檔案的時候, 要怎樣去區分?
    @pysh@163.com
      回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-08-01 16:37 | lostfire
    @air

    據我所知,multi-part是post的一種方式,我并沒有遇到過get到multi-part的情況,可以提供一個網址,我也想看看get到multi-part是一種什么情況。  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2006-11-10 15:58 | guolp
    哥們,驗證碼的問題有解決方案沒有,能不能發布出來以供學習呀
    或者發郵件也可以
    mail:mlssoft@126.com  回復  更多評論
      
    # re: httpclient 3.0初步研究
    2007-11-03 14:06 | 中華信鴿
    驗證碼可不好過。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    主站蜘蛛池模板: 国产一级淫片免费播放电影| 91福利视频免费观看| 日本视频免费在线| 亚洲日本乱码一区二区在线二产线 | 国产精品久久永久免费| 亚洲精品国产免费| 精品久久久久成人码免费动漫| 亚洲国产成人久久精品app| 妻子5免费完整高清电视| 免费视频爱爱太爽了| 国内成人精品亚洲日本语音| 免费国内精品久久久久影院| xxxxxx日本处大片免费看| 国产一级一片免费播放i| AAAAA级少妇高潮大片免费看| 亚洲av伊人久久综合密臀性色| 夜夜爽妓女8888视频免费观看| 亚洲国产一成久久精品国产成人综合| 成av免费大片黄在线观看| 亚洲一区中文字幕| 久久精品国产精品亚洲精品| 四虎成人免费观看在线网址| 中国好声音第二季免费播放| aa毛片免费全部播放完整| 亚洲AV无码不卡在线播放| 91在线老王精品免费播放| 77777亚洲午夜久久多喷| 国产精品麻豆免费版| 两个人看的www免费高清| 亚洲视频手机在线| 国产大片91精品免费观看男同| 羞羞的视频在线免费观看| 亚洲色欲久久久综合网| 最刺激黄a大片免费网站| 亚洲日本VA午夜在线影院| 免费一级毛片在线播放不收费| 免费黄网站在线看| 亚洲中文字幕无码爆乳app| 在线观看亚洲精品福利片| 精品国产污污免费网站aⅴ| 日本亚洲中午字幕乱码|