<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做點(diǎn)自動(dòng)化的工作,不過(guò)現(xiàn)在看來(lái)并沒(méi)有想象中的那么輕松。
    實(shí)際上登錄一個(gè)網(wǎng)站,訪問(wèn)某個(gè)特點(diǎn)的頁(yè)面,發(fā)表一篇文章,上傳一些文件,并不是一個(gè)簡(jiǎn)單的事情。
    HttpClient的基本使用因?yàn)榘l(fā)布的代碼中帶有幾個(gè)例子,應(yīng)該算是不難掌握的事情。下面我說(shuō)下我遇到的幾個(gè)問(wèn)題。

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

    2,笨蛋Cookie問(wèn)題:
    如果你要發(fā)送多個(gè)cookie,其實(shí)可以這樣發(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),
    ????????}
    );

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

    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,編碼問(wèn)題:

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

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


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


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


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

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

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

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

    cookie基本上不是問(wèn)題。設(shè)置兼容的CookiePolicy即可

    post的值要全面,一般來(lái)說(shuō),把需要post的頁(yè)面先get下來(lái),把各個(gè)field的值 set到需要post的頁(yè)面上會(huì)減輕很多工作。

    但很多網(wǎng)站很刁難的進(jìn)行了許多其他工作,逐個(gè)的分析太煩人的。如果您能對(duì)donews的blog利用httpclient維護(hù)。歡迎賜教。





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

    據(jù)我所知,multi-part是post的一種方式,我并沒(méi)有遇到過(guò)get到multi-part的情況,可以提供一個(gè)網(wǎng)址,我也想看看get到multi-part是一種什么情況。  回復(fù)  更多評(píng)論
      
    # re: httpclient 3.0初步研究
    2006-11-10 15:58 | guolp
    哥們,驗(yàn)證碼的問(wèn)題有解決方案沒(méi)有,能不能發(fā)布出來(lái)以供學(xué)習(xí)呀
    或者發(fā)郵件也可以
    mail:mlssoft@126.com  回復(fù)  更多評(píng)論
      
    # re: httpclient 3.0初步研究
    2007-11-03 14:06 | 中華信鴿
    驗(yàn)證碼可不好過(guò)。  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    主站蜘蛛池模板: 色欲aⅴ亚洲情无码AV| 免费看大黄高清网站视频在线| 亚洲熟妇自偷自拍另欧美| 人人狠狠综合久久亚洲婷婷| 成年人免费观看视频网站| 少妇无码一区二区三区免费| 特级做a爰片毛片免费看| 亚洲精品V天堂中文字幕| 亚洲一区无码中文字幕乱码| 亚洲爆乳精品无码一区二区三区| 全部免费毛片免费播放| 国产成人免费爽爽爽视频| 91精品手机国产免费| 国产成人无码区免费网站| 亚洲免费在线观看| 色多多A级毛片免费看| 亚洲国产欧美日韩精品一区二区三区| 亚洲福利一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 亚洲欧洲自拍拍偷午夜色无码| 亚洲成a人片在线观看日本麻豆| 免费看的一级毛片| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲午夜福利精品无码| 四虎永久在线精品视频免费观看| 四虎影院免费视频| 永久免费无码网站在线观看| 免费高清小黄站在线观看| 成年女人免费视频播放77777| 在线观看特色大片免费视频 | 亚洲永久永久永久永久永久精品| 亚洲精品午夜无码专区| 亚洲尤码不卡AV麻豆| 亚洲精品无码久久久久去q| 亚洲日韩精品一区二区三区| 亚洲乱码国产乱码精品精| 国产亚洲福利精品一区| 亚洲av无码不卡一区二区三区| 亚洲av伊人久久综合密臀性色| 亚洲av午夜福利精品一区人妖| 久久精品国产亚洲AV麻豆王友容|