HttpClient4,最原始的需求就是使用其來模擬瀏覽器想服務器發起http請求,固然,他的功能不止於此,可是我須要的就是這個功能而已,jdk也有其自帶的相似的api:UrlConnection,效率比httpclient高,可是和其餘第三方產品同樣,比httpclient原始,其實http協議是在tcp/ip協議之上的,因此,若是是用socket來實現也是能夠的,只不過更原始了,沒這個必要了!html
Httpclient4和Httpclient3的區別較大,但若是會用一個,另外一個只要看一下例子或api就會用了,簡單!java
實例化一個client,設置策略:api
DefaultHttpClient client = new DefaultHttpClient(); //設置 HttpClient 接收 Cookie,用與瀏覽器同樣的策略 client.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
實例化一個Post方法:瀏覽器
這裏的gsid是微博是否登陸成功的關鍵,相關知識是在模擬微博登陸的過程當中的,後來我還發現還有一個st的參數也是必不可少的,這個參數也能夠經過登陸以後分析獲取。就是這麼簡單。
服務器
HttpPost post = new HttpPost("http://weibo.cn/mblog/sendmblog?vt=4&gsid="+gsid+"&st=" + st);//de00
爲這個post請求設置http頭信息:cookie
這些頭信息咱們能夠先在瀏覽器訪問這個鏈接地址,好比在firefox,而後用httpfox工具抓取這個請求信息,而後按照抓到的信息一個一個的填寫。
併發
post.setHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"); post.setHeader("host", "weibo.cn"); post.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); post.setHeader("Accept-Language","zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); post.setHeader("Accept-Encoding", "gzip, deflate");//沒有這句,反饋回來的response Content-Length 值爲0,因此要加上這句,一點一點的和HttpFox抓取的數據比較,就能夠找出問題所在。 post.setHeader("Referer","http://weibo.cn/mblog/sendmblog?vt=4&gsid=" + gsid + "&st=" + st);//13c5 //post.setHeader("Referer","http://m.weibo.cn/"); post.setHeader("Cookie", "gsid_CTandWM=" + gsid); post.setHeader("Connection","keep-alive"); post.setHeader("Content-Type","multipart/form-data; boundary=---------------------------9994580724461");
多媒體實體:app
其中分割線與Header中的參數boundary一致。
socket
MultipartEntity reqEntity = new MultipartEntity(null,"---------------------------9994580724461", null);
給多媒體實體設置相應的參數,包括圖片:tcp
String imageurl = "D:\\baiduimage-jiezhi\\" + this.getImageNameCount() + ".jpg"; StringBody con = new StringBody("戒指控 @愛銀飾"); reqEntity.addPart("content", con); if (!imageurl.equals("")) { FileBody file = new FileBody(new File(imageurl),"image/jpeg");//這裏和HttpFox抓到的數據一致,根據網貼設置爲file不行,要」image/jpeg「才行。 reqEntity.addPart("pic", file); } //這個visible參數也是經過httpfix抓取請求時能夠看到的,因此須要加上 reqEntity.addPart("visible", new StringBody("0")); post.setEntity(reqEntity);
發送請求,得到反饋response:
HttpResponse resp = client.execute(post);
固然咱們能夠經過HttpResponse對象看咱們是否發送成功等等。
在模擬微博登錄併發送微博的過程當中遇到不少問題,都是經過一點一點的嘗試解決的,特別是發送文字+圖片微博,這點仍是比較麻煩的,不事後來總算解決,已經改兩個月過去了,呵呵,纔來寫這篇總結,算是記錄一下吧,具體仍是要看項目中的代碼和具體的需求啦!