亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 21000 | 回復(fù): 14
打印 上一主題 下一主題

【教程】模擬登陸百度之Java代碼版 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-09-17 20:39 |只看該作者 |倒序?yàn)g覽
本帖最后由 crifan 于 2013-09-17 20:40 編輯

原發(fā)于:
【教程】模擬登陸百度之Java代碼版



【背景】
之前已經(jīng)寫了教程,分析模擬登陸百度的邏輯:
【教程】手把手教你如何利用工具(IE9的F12)去分析模擬登陸網(wǎng)站(百度首頁)的內(nèi)部邏輯過程
然后又去用不同的語言:
Python的:
【教程】模擬登陸網(wǎng)站 之 Python版(內(nèi)含兩種版本的完整的可運(yùn)行的代碼)
C#的:
【教程】模擬登陸網(wǎng)站 之 C#版(內(nèi)含兩種版本的完整的可運(yùn)行的代碼)
去實(shí)現(xiàn)對(duì)應(yīng)邏輯。
此處,繼續(xù)嘗試,用Java代碼,實(shí)現(xiàn)這套,模擬登陸百度,的邏輯。
【折騰過程】
1.之前已經(jīng)整理了一些Java代碼:
http://code.google.com/p/crifanlib/source/browse/trunk/java/crifanLib.java
現(xiàn)在是:
繼續(xù)去豐富此套庫。
然后把模擬登陸百度的邏輯模擬出來。
2.期間,想要實(shí)現(xiàn)Java的函數(shù)的默認(rèn)參數(shù),結(jié)果卻發(fā)現(xiàn)不支持:
【已解決】Java中函數(shù)的默認(rèn)參數(shù)
3.然后就是一點(diǎn)點(diǎn)去寫代碼,去調(diào)試了。
4.期間,出錯(cuò)了:
【基本解決】java中沒法new:Cannot instantiate the type HttpParams
5.再去搞懂參數(shù)配置:
【整理】關(guān)于Java中的httpClient中可以傳入的參數(shù)
6.再繼續(xù)寫代碼,期間遇到各種問題,基本都解決了:
【已解決】Java代碼中new List時(shí)出錯(cuò):Cannot instantiate the type List<NameValuePair>
【已解決】實(shí)現(xiàn)Java中控制臺(tái)中輸入字符串
【無需解決】Java代碼new BasicNameValuePair時(shí)出錯(cuò):The constructor BasicNameValuePair(String, boolean) is undefined
【已解決】Java中實(shí)現(xiàn){String, boolean}類型的字典Dict變量
【已解決】Eclipse中用java代碼去new Date結(jié)果出錯(cuò):The constructor Date(String) is deprecated
【暫未解決】Eclipse中調(diào)試Java代碼期間如何修改值
【已解決】Java中的new Date所得的年份異常:傳入2043年結(jié)果卻是3943年

7.最終,完成了,主體代碼為:
  1. /**
  2. * [File]
  3. * EmulateLoginBaidu.java
  4. *
  5. * [Function]
  6. * Use Java code to emulate login baidu
  7. *
  8. * 【教程】模擬登陸百度之Java代碼版
  9. * http://www.crifan.com/emulate_login_baidu_use_java_code
  10. *
  11. * [Version]
  12. * v1.0, 2013-09-17
  13. *
  14. * [Note]
  15. * 1. need add apache http lib:
  16. * 【已解決】Eclipse的java代碼出錯(cuò):The import org.apache cannot be resolved
  17. * http://www.crifan.com/java_eclipse_the_import_org_apache_cannot_be_resolved/
  18. * 2.need crifanLib.java
  19. * http://code.google.com/p/crifanlib/source/browse/trunk/java/crifanLib.java
  20. *
  21. * [History]
  22. * [v1.0]
  23. * 1. initial version, finally successfully emulate login baidu using java code.
  24. */

  25. //import java.io.IOException;
  26. import java.util.ArrayList;
  27. //import java.util.Calendar;
  28. //import java.util.Date;
  29. //import java.util.GregorianCalendar;
  30. import java.util.HashMap;
  31. //import java.util.Hashtable;
  32. import java.util.List;
  33. //import java.util.Map;
  34. import java.util.Scanner;
  35. import java.util.regex.Matcher;
  36. import java.util.regex.Pattern;

  37. import org.apache.http.HttpResponse;
  38. import org.apache.http.NameValuePair;
  39. import org.apache.http.cookie.Cookie;
  40. //import org.apache.http.impl.cookie.BasicClientCookie;
  41. //import org.apache.http.impl.cookie.BasicClientCookie2;
  42. import org.apache.http.message.BasicNameValuePair;

  43. //import crifanLib;

  44. /**
  45. * @author CLi
  46. *
  47. */
  48. public class EmulateLoginBaidu {
  49.     static crifanLib crl;

  50.     /**
  51.      * @param args
  52.      */
  53.     public static void main(String[] args) {
  54.         crl = new crifanLib();
  55.                  
  56.         // TODO Auto-generated method stub
  57.         EmulateLoginBaiduUsingJava();
  58.     }

  59.     // emulate login baidu using java code  
  60.     public static void EmulateLoginBaiduUsingJava()
  61.     {
  62.         System.out.println("============ 程序說明 ============");
  63.         System.out.println("功能:本程序是用來演示使用Java代碼去實(shí)現(xiàn)模擬登陸百度");
  64.         System.out.println("注意事項(xiàng):部分百度賬戶,在登陸時(shí)會(huì)出現(xiàn):");
  65.         System.out.println("1.部分百度賬戶,在登陸時(shí)會(huì)出現(xiàn):");
  66.         System.out.println("系統(tǒng)檢測(cè)到您的帳號(hào)疑似被盜,存在安全風(fēng)險(xiǎn)。請(qǐng)盡快修改密碼。");
  67.         System.out.println("此時(shí),本程序,無法成功模擬登陸,請(qǐng)自行按照提示去修改密碼后,就可以了。");
  68.          
  69.         boolean bLoginBaiduOk = false;
  70.         List<Cookie> curCookieList;
  71.          
  72.         //step1: login baidu, got cookie BAIDUID
  73.         System.out.println("====== 步驟1:獲得BAIDUID的Cookie ======");
  74.         String strTokenValue = "";
  75.         boolean bGotCookieBaiduid = false;
  76.         String strBaiduUrl = "http://www.baidu.com/";
  77.         HttpResponse baiduResp = crl.getUrlResponse(strBaiduUrl);
  78.          
  79.         curCookieList =crl.getCurCookieStore().getCookies();
  80.         crl.dbgPrintCookies(curCookieList, strBaiduUrl);
  81.         for(Cookie ck : curCookieList)
  82.         {
  83.             String cookieName = ck.getName();
  84.             if(cookieName.equals("BAIDUID"))
  85.             {
  86.                 bGotCookieBaiduid = true;
  87.             }
  88.         }
  89.         if (bGotCookieBaiduid)
  90.         {
  91.             System.out.println("正確:已找到cookie BAIDUID");
  92.         }
  93.         else
  94.         {
  95.             System.out.println("錯(cuò)誤:沒有找到cookie BAIDUID !");
  96.         }
  97.          
  98.         //step2: login, pass paras, extract resp cookie
  99.         System.out.println("====== 步驟2:提取login_token ======");
  100.         boolean bExtractTokenValueOK = false;
  101.         if(bGotCookieBaiduid)
  102.         {
  103.             //https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
  104.             String getapiUrl = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true";
  105.             String getApiRespHtml = crl.getUrlRespHtml(getapiUrl);
  106.             
  107.             curCookieList =crl.getCurCookieStore().getCookies();
  108.             crl.dbgPrintCookies(curCookieList, getapiUrl);

  109.             //bdPass.api.params.login_token='3cf421493884e0fe9080593d05f4744f';
  110.             Pattern tokenValP = Pattern.compile("bdPass\\.api\\.params\\.login_token='(?<tokenVal>\\w+)';");
  111.             Matcher tokenValMatcher = tokenValP.matcher(getApiRespHtml);
  112.             //boolean foundTokenValue = tokenValMatcher.matches(); // will not match, but can search to find it
  113.             boolean foundTokenValue = tokenValMatcher.find();
  114.             if(foundTokenValue)
  115.             {
  116.                 strTokenValue = tokenValMatcher.group("tokenVal"); //3cf421493884e0fe9080593d05f4744f
  117.                 System.out.println("正確:找到 bdPass.api.params.login_token=" + strTokenValue);
  118.                  
  119.                 bExtractTokenValueOK = true;
  120.             }
  121.             else
  122.             {
  123.                 System.out.println("錯(cuò)誤:沒找到bdPass.api.params.login_token !");
  124.             }
  125.         }
  126.          
  127.         //step3: verify returned cookies
  128.         if (bGotCookieBaiduid && bExtractTokenValueOK)
  129.         {
  130.             System.out.println("======步驟3:登陸百度并檢驗(yàn)返回的Cookie ======");
  131.             
  132.             /*
  133.             //Note:
  134.             //here, has verify, not manually update some cookie's domain and expiry
  135.             //also can emulate baidu successfully
  136.             
  137.             //do some workaround to makesure here cookie H_PS_PSSID not expire
  138.             //[version: 0][name: H_PS_PSSID][value: 3359_3341_2776_1424_2981][domain: .baidu.com][path: /][expiry: null]
  139.             
  140.             //Thu Sep 17 14:22:08 CST 2043
  141.             //Date newExpiryDate = new Date(2043, 9, 17);
  142.             Date newExpiryDate = new Date(143, 9, 17);
  143.             //Calendar newExpiryCalendar = new GregorianCalendar(2043, 9, 17, 14, 22, 8);
  144.             
  145.             BasicClientCookie hPsPssidCookie = null;
  146.             BasicClientCookie dbsvrtmCookie = null;
  147.             //int hPsPssidCookieIdx = 0;
  148.             
  149.             curCookieList = crl.getCurCookieList();
  150.             for(Cookie ck : curCookieList)
  151.             {
  152.                 if(ck.getName().equalsIgnoreCase("H_PS_PSSID"))
  153.                 {
  154.                     //hPsPssidCookieIdx = curCookieList.indexOf(ck);
  155.                     hPsPssidCookie = (BasicClientCookie) ck;
  156.                     hPsPssidCookie.setExpiryDate(newExpiryDate);
  157.                     ck = hPsPssidCookie;
  158.                     //break;
  159.                 }
  160.                  
  161.                 if(ck.getName().equalsIgnoreCase("BDSVRTM"))
  162.                 {
  163.                     dbsvrtmCookie = (BasicClientCookie) ck;
  164.                     dbsvrtmCookie.setDomain(".baidu.com");
  165.                     dbsvrtmCookie.setExpiryDate(newExpiryDate);
  166.                     ck = dbsvrtmCookie;
  167.                     //break;
  168.                 }
  169.             }
  170.             crl.setCurCookieList(curCookieList);
  171.             */

  172.             
  173.             String staticPageUrl = "http://www.baidu.com/cache/user/html/jump.html";

  174.             List<NameValuePair> postDict = new ArrayList<NameValuePair>();
  175.             //ArrayList<NameValuePair> headerDict = new ArrayList<NameValuePair>();
  176.             //postDict.add(new BasicNameValuePair("ppui_logintime", ""));
  177.             postDict.add(new BasicNameValuePair("charset", "utf-8"));
  178.             //postDict.add(new BasicNameValuePair("codestring", ""));
  179.             postDict.add(new BasicNameValuePair("token", strTokenValue));
  180.             postDict.add(new BasicNameValuePair("isPhone", "false"));
  181.             postDict.add(new BasicNameValuePair("index", "0"));
  182.             //postDict.add(new BasicNameValuePair("u", ""));
  183.             //postDict.add(new BasicNameValuePair("safeflg", "0"));
  184.             postDict.add(new BasicNameValuePair("staticpage", staticPageUrl));
  185.             postDict.add(new BasicNameValuePair("loginType", "1"));
  186.             postDict.add(new BasicNameValuePair("tpl", "mn"));
  187.             postDict.add(new BasicNameValuePair("callback", "parent.bdPass.api.login._postCallback"));
  188.             
  189.             //get input baidu username and password
  190.             String strBaiduUsername = "";
  191.             String strBaiduPassword = "";
  192.             Scanner inputReader = new Scanner(System.in);
  193.             System.out.println("Please Enter Your:" );
  194.             System.out.println("Baidu Username:" );
  195.             strBaiduUsername = inputReader.nextLine();
  196.             //System.out.println("You Entered Username=" + strBaiduUsername);
  197.             System.out.println("Baidu Password:" );
  198.             strBaiduPassword = inputReader.nextLine();
  199.             //System.out.println("You Entered Password=" + strBaiduPassword);
  200.             inputReader.close();

  201.             postDict.add(new BasicNameValuePair("username", strBaiduUsername));
  202.             postDict.add(new BasicNameValuePair("password", strBaiduPassword));
  203.             
  204.             postDict.add(new BasicNameValuePair("verifycode", ""));
  205.             postDict.add(new BasicNameValuePair("mem_pass", "on"));

  206.             String baiduMainLoginUrl = "https://passport.baidu.com/v2/api/?login";
  207.             String loginBaiduRespHtml = crl.getUrlRespHtml(baiduMainLoginUrl, null, postDict);
  208.             
  209.             //Map cookieNameDict = new Map();
  210.             //Map cookieNameDict = new Hashtable();
  211.             HashMap<Object, Boolean> cookieNameDict = new HashMap<Object, Boolean>();     
  212.             cookieNameDict.put("BDUSS", false);
  213.             cookieNameDict.put("PTOKEN", false);
  214.             cookieNameDict.put("STOKEN", false);
  215.             //Set-Cookie: SAVEUSERID=deleted; expires=Mon, 17-Sep-2012 09:45:03 GMT; path=/; domain=passport.baidu.com; httponly,
  216.             //cookieNameDict.put("SAVEUSERID", false);
  217.             
  218.             curCookieList = crl.getCurCookieList();
  219.             for(Object objCookieName : cookieNameDict.keySet().toArray())
  220.             {
  221.                 String strCookieName = objCookieName.toString();
  222.                 for(Cookie ck: curCookieList)
  223.                 {
  224.                     if(strCookieName.equalsIgnoreCase(ck.getName()))
  225.                     {
  226.                         cookieNameDict.put(strCookieName, true);
  227.                     }
  228.                 }
  229.             }
  230.             
  231.             boolean bAllCookiesFound = true;
  232.             for (Object  objFoundCurCookie : cookieNameDict.values())
  233.             {
  234.                 bAllCookiesFound = bAllCookiesFound && Boolean.parseBoolean(objFoundCurCookie.toString());
  235.             }

  236.             bLoginBaiduOk = bAllCookiesFound;
  237.                         
  238.             if (bLoginBaiduOk)
  239.             {
  240.                 System.out.println("成功模擬登陸百度首頁!" );
  241.             }
  242.             else
  243.             {
  244.                 System.out.println("模擬登陸百度首頁 失敗!");
  245.                 System.out.println("所返回的HTML源碼為:" + loginBaiduRespHtml);
  246.             }
  247.         }

  248.         return;
  249.     }
  250. }
復(fù)制代碼

正常,成功模擬登陸百度的輸出為:



8.完整的Eclipse下面的代碼下載:
EmulateLoginBaidu_java_2013-09-17_crifanLibVersion.7z (14.29 KB, 下載次數(shù): 200)

注意:
1.使用此項(xiàng)目,需要導(dǎo)入org.apache.http的庫。
詳見:
【已解決】Eclipse的java代碼出錯(cuò):The import org.apache cannot be resolved
2.上面的貼出來的代碼,用到了對(duì)應(yīng)的我自己的java庫,需要的先去下載,才能用上面代碼:
crifanLib.java

3.部分百度賬戶,在登陸時(shí)會(huì)出現(xiàn):
  
系統(tǒng)檢測(cè)到您的帳號(hào)疑似被盜,存在安全風(fēng)險(xiǎn)。請(qǐng)盡快修改密碼。
此時(shí),本程序,無法成功模擬登陸,請(qǐng)自行按照提示去修改密碼后,就可以了。

【總結(jié)】
java在處理http方面的庫,相對(duì)來說,還是很不方便使用。
只能算是基本夠用吧。

論壇徽章:
39
白銀圣斗士
日期:2015-11-24 10:40:40酉雞
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午馬
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09雙子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44獅子座
日期:2015-03-20 14:11:29亥豬
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
2 [報(bào)告]
發(fā)表于 2013-09-19 18:30 |只看該作者
用HttpClient就方便許多

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-09-20 20:46 |只看該作者
本帖最后由 crifan 于 2013-09-20 20:47 編輯

回復(fù) 2# rover12421


   1.我本來就是用的HttpClient
   2.不知道高手有何更好的建議,如何"更方便"?

論壇徽章:
39
白銀圣斗士
日期:2015-11-24 10:40:40酉雞
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午馬
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09雙子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44獅子座
日期:2015-03-20 14:11:29亥豬
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
4 [報(bào)告]
發(fā)表于 2013-09-21 15:35 |只看該作者
1.第一次還真沒看出你用了httpclient,原來是自己封裝了一層
2.httpclient本身就維護(hù)了cookies,根本不需要自己處理
3.crifanLib里每次請(qǐng)求都new一個(gè)httpClient,根本就不合理,難怪你要自己維護(hù)cookies
4.建議你看看xmlrpc對(duì)httpclient的封裝,那個(gè)才叫漂亮,你這樣封裝還不如不封裝,用起來比原來還累.httpclient直接post String,在很多情況下不需要自己那么累的構(gòu)建一個(gè)list,很多時(shí)候也使用者也不太愿意把一個(gè)post的string變成list來用
5.校驗(yàn)也可以不用從cookies里判斷,既然已經(jīng)的到了請(qǐng)求的html,為何不從html里找特征校驗(yàn)?zāi)?/td>

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-09-22 09:38 |只看該作者
回復(fù) 4# rover12421


    1.第一次還真沒看出你用了httpclient,原來是自己封裝了一層
2.httpclient本身就維護(hù)了cookies,根本不需要自己處理
有空再去看看,httpClient是如何自動(dòng)處理cookie的。

3.crifanLib里每次請(qǐng)求都new一個(gè)httpClient,根本就不合理,難怪你要自己維護(hù)cookies
謝謝批評(píng),抽空去研究研究。

4.建議你看看xmlrpc對(duì)httpclient的封裝,那個(gè)才叫漂亮,你這樣封裝還不如不封裝,用起來比原來還累.httpclient直接post String,在很多情況下不需要自己那么累的構(gòu)建一個(gè)list,很多時(shí)候也使用者也不太愿意把一個(gè)post的string變成list來用
post data,是list而不是處理后的xxx=yyy&xxx=yyy,目的就是減少用戶手動(dòng)處理。
“很多時(shí)候也使用者”
可否給出一些比較經(jīng)典的用例,供偶參考看看?

5.校驗(yàn)也可以不用從cookies里判斷,既然已經(jīng)的到了請(qǐng)求的html,為何不從html里找特征校驗(yàn)?zāi)?br /> 校驗(yàn)的思路,從html找特征和cookie中找cookie,理論上,都是可以的。
但是個(gè)人覺得cookie更靠譜。
另外,庫中提供了get和set cookie的功能,目的是為了有些特殊情況下,需要用戶手動(dòng)修改cookie,比如更改domain,供訪問另外一個(gè)url使用。
所以才有操作cookie的功能。
而此處,正好就可以用得上獲得當(dāng)前cookie的功能。
到底是用html還是cookie去校驗(yàn),純屬個(gè)人偏好。

論壇徽章:
39
白銀圣斗士
日期:2015-11-24 10:40:40酉雞
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午馬
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09雙子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44獅子座
日期:2015-03-20 14:11:29亥豬
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
6 [報(bào)告]
發(fā)表于 2013-09-22 12:21 |只看該作者
回復(fù) 5# crifan


    4.很多時(shí)候都是先截包,但是截包工具能直接復(fù)制出來的肯定是String,如果需要修改的很多,肯定是希望直接使用string,而不是拆分成list.如果每一個(gè)都要參數(shù)都要該,那當(dāng)然是list比較好,但是就封裝而言.就算是需要list.那應(yīng)該也要做到,用戶直接給一個(gè)hashmap就能完成的動(dòng)作,而不是讓用戶自己主動(dòng)去做一個(gè)BasicNameValuePair的list,這樣的封裝意義不大.建議這樣的直接傳里一個(gè)hashmap.至于hashmap怎么變成一個(gè)BasicNameValuePair的list才是你封裝要做的事.
      怎么post一個(gè)string,給你一個(gè)例子:
  1. StringEntity entity = new StringEntity(string, charset);
  2.                 entity.setContentType("application/x-www-form-urlencoded; charset=" + charset);

  3. post.setEntity(entity);
復(fù)制代碼
HttpEntity有很多繼承類,可以多看看

---------------
httpclient的本身就支持cookies的設(shè)置和修改.而且我并沒看出的你對(duì)cookies的封裝比httpclient的好,對(duì)用戶來說,從你的封裝操作cookies和直接對(duì)httpclient上操作cookies步驟是一樣的,而對(duì)httpclient來說,你卻反而多了一步,并且你并沒給用戶帶來直接對(duì)httpclient更方便和快捷的一面,這樣的封裝有必要嗎?
如果要封裝cookies操作,當(dāng)然是要提供直接針對(duì)"key","vaule"的操作(添加,刪除,修改),這是httpclient原本沒有的,而且能大大方便用戶為達(dá)到此目的代碼復(fù)雜度.
--------------
封裝固然是好,但是要先對(duì)封裝的對(duì)象做一個(gè)比較深入一點(diǎn)的了解.不要為了封裝而封裝.

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2013-09-22 15:36 |只看該作者
回復(fù) 6# rover12421


    "很多時(shí)候都是先截包,但是截包工具能直接復(fù)制出來的肯定是String,如果需要修改的很多"
我之前所了解到的:
肯定不建議,去直接拷貝出來從抓包工具分析出來的post data的string
因?yàn)椋?br /> 我所遇到的,更多的時(shí)候,key和value中,key雖然不變,
但是value往往和你當(dāng)前的上下文相關(guān)。
所以,最好還是:
通過抓包工具分析該value是如何獲得的
然后再寫代碼去模擬。

對(duì)于不建議直接拷貝出來的內(nèi)容,之前還寫了個(gè),供之前有人直接拷貝粘貼cookie值或者其他值,但是程序不工作的人的一些提示:
【總結(jié)】靜態(tài)網(wǎng)頁抓取,動(dòng)態(tài)網(wǎng)頁抓取,模擬登陸的注意事項(xiàng)和心得
中的“寫程序模擬執(zhí)行過程時(shí),不能直接拷貝分析而得的數(shù)據(jù),而要自己用程序模擬出來

"肯定是希望直接使用string,而不是拆分成list."
對(duì)此,我個(gè)人不是很贊同:
我倒是覺得,至少我個(gè)人覺得,對(duì)于post string的話
正常的用戶的用法,都是:
通過key和value去設(shè)置對(duì)應(yīng)的值

而設(shè)置完畢后,再調(diào)用
Python中的urllib.urlencode
C#中的HttpUtility.UrlPathEncode
java中的UrlEncodedFormEntity
go語言中的url.Values
去進(jìn)行相關(guān)的encode,才得到對(duì)應(yīng)post data的string的。
在這點(diǎn)上,個(gè)人認(rèn)為,先拿到key,value的鍵對(duì)再去encode為post string,更加符合http領(lǐng)域,通用的做法。
否則,各種語言的http的庫,就至少?zèng)]有必要再提供相關(guān)的encode的了。

“用戶直接給一個(gè)hashmap就能完成的動(dòng)作,而不是讓用戶自己主動(dòng)去做一個(gè)BasicNameValuePair的list,”
至于key,value的鍵對(duì),
由于個(gè)人不是很熟悉java
雖然之前也用過hashmap,但是此處是參考別人的做法,覺得用上BasicNameValuePair的list。
此點(diǎn),經(jīng)過你這個(gè)提醒,我也覺得,用hashmap可能更合適。
其也是我的本意:
就像Python中的dict,本來就應(yīng)該是字典類的變量,保存這樣的信息,更合適。

“HttpEntity有很多繼承類,可以多看看”
是的,抽空再好好研究。謝謝提醒。

“httpclient的本身就支持cookies的設(shè)置和修改.”
我后來才看懂你的意思:
你是說,我封裝后,手動(dòng)操作了cookie?
實(shí)際上不是,我只是:
提供給外接get或set cookie的接口
方便用戶,如果有需要的話,去操作cookie而已。
并沒有額外進(jìn)行cookie的管理。
因?yàn)榫拖衲阏f的,httpClient本身就已經(jīng)管理了cookie了。

“封裝固然是好,但是要先對(duì)封裝的對(duì)象做一個(gè)比較深入一點(diǎn)的了解.不要為了封裝而封裝.”
關(guān)于你這個(gè)理念,完全贊同。
我不會(huì)去為了什么而什么的。
只是,至少以自己要是一個(gè)普通用戶的角度出發(fā),覺得有封裝的必要,才會(huì)去封裝。
目前來說,對(duì)于java版本的getUrlRespHtml等函數(shù)來說,
自己對(duì)自己的評(píng)價(jià)是:
還是值得封裝的,只是個(gè)別做法,還有待商榷和優(yōu)化而已。

無論如何,歡迎繼續(xù)探討。謝謝提醒。

論壇徽章:
39
白銀圣斗士
日期:2015-11-24 10:40:40酉雞
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午馬
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09雙子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44獅子座
日期:2015-03-20 14:11:29亥豬
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
8 [報(bào)告]
發(fā)表于 2013-09-22 16:27 |只看該作者
本帖最后由 rover12421 于 2013-09-22 16:28 編輯

說實(shí)話,你的封裝已經(jīng)算不上封裝了,因?yàn)槟阋呀?jīng)把原本httpclient提供的強(qiáng)大功能給禁錮起來只能適用你需要的情況了.
就因?yàn)槟惆言械墓δ芙d起來,才有了,為了提供原本已經(jīng)有cookies獲取和設(shè)置功能,你為了能的到這個(gè)功能不的不自己再寫一個(gè)設(shè)置和獲取的函數(shù)

封裝很多時(shí)候是為了減少重復(fù)代碼,精簡(jiǎn)代碼而做的,比如你寫的getUrlRespHtml,就想一步獲取源碼,downlodFile也是一樣,想一步做到下載.但如果你熟悉httpclient你會(huì)封裝的更好.
像設(shè)置header的地方.其實(shí)封裝很簡(jiǎn)單,沒必要讓用戶提供一個(gè)key-value的鏈,只要提供一個(gè)簡(jiǎn)單的設(shè)置頭部key-value的方法既可.設(shè)置一個(gè)key-value是一行代碼,往key-value的鏈里添加一行,也是一行代碼,有時(shí)候還往往多出new這個(gè)鏈的一行代碼.這樣的封裝就沒必要.
而且前一種會(huì)更清晰,下一步的方法也少了一個(gè)參數(shù).
我看你的crifanLib.java里原本打算使用外部傳來的key-value的鏈的,不知道為后來又不用了呢?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2013-09-22 16:46 |只看該作者
本帖最后由 crifan 于 2013-09-22 16:53 編輯

回復(fù) 8# rover12421


    "我看你的crifanLib.java里原本打算使用外部傳來的key-value的鏈的,不知道為后來又不用了呢?"
你指的是“headerDict”?
簡(jiǎn)答:
是想要用到的,只是暫時(shí)沒時(shí)間,沒精力,去完善這個(gè)庫函數(shù)而已。

詳解:
1.我此處的,java版本的getUrlRespHtml(以及還沒來得及寫的getUrlResponse)
都還是未完成的版本,算是初級(jí)版本,從功能角度來說,只算0.2這種級(jí)別的,里1.0的完善的功能,差很多。
像getUrlRespHtml這樣的函數(shù),對(duì)于java版本,其實(shí)還需要添加太多功能
比如:
支持(多種格式類型的)壓縮
代理
設(shè)置各種默認(rèn)的常用的header參數(shù):什么user-agent等等
和用戶手動(dòng)設(shè)置的header參數(shù):除了常見之前的,運(yùn)行用戶手動(dòng)添加別的
允許用戶操作cookie(以便實(shí)現(xiàn)更改domain等動(dòng)作,實(shí)現(xiàn)后續(xù)訪問不同的url可以真正實(shí)現(xiàn)發(fā)送cookie等等)
支持手動(dòng)設(shè)置charset或默認(rèn)自動(dòng)解碼為unicode
支持各種timeout的設(shè)置
等等等等。。。。
等以后有空,會(huì)繼續(xù)更新的。

2. 你要是感興趣,可以去看看我的:
v8.5的crifanLib.cs
和:
v4.7的:crifanLib.py
里面都有類似的:
getUrlRespHtml
getUrlResponse
等函數(shù)的。
那些,是已經(jīng)完善(經(jīng)過N次修補(bǔ)bug,功能增加的)更新后的。
而且還是,又額外花了很多精力,去寫教程,說明如何使用該庫:
詳解crifan的Python庫:crifanLib.py
詳解crifan的C#庫:crifanLib.cs

3.除此之前,還有其他語言的各種庫函數(shù),以及C#,Python等出了crifanLib的函數(shù),都早已放出:
crifanLib
總體算上,java版本的crifanLib.java
只算功能或代碼量上的,5%左右(應(yīng)該是不到10%)的。
而我折騰java,也只算業(yè)余的業(yè)余,但是盡量是,接觸到了,就整理出來,我認(rèn)為有用的功能。
更多功能,只能等我有空再更新。

其他我寫的很多東西,比如:
crifanLibAws.cs
算屬于:domain lib,屬于某個(gè)特定領(lǐng)域的,這些東西,只有用到人,才知道其價(jià)值,才知道可以幫其省多少精力的。


4.總之:
(1)當(dāng)前的java版本的getUrlRespHtml,很不完善,有待后續(xù)更新。
(2)估計(jì),只有等我的crifanLib.java,發(fā)展到1.0之后,你才能明白,我為何要封裝:
保證絕大多數(shù)人的,絕大多數(shù)復(fù)雜的請(qǐng)求,只需通過調(diào)用getUrlRespHtml或getUrlResponse,即可完成其目的(獲得需要的html或response)。

論壇徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大;照
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大;照
日期:2013-09-18 15:18:22CU大;照
日期:2013-09-18 15:18:43CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
10 [報(bào)告]
發(fā)表于 2013-11-29 12:44 |只看該作者
話說前幾天用java寫了投票程序。
還是比之前用c++寫快的多。。。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP