1. 程式人生 > >【經驗總結】Http,網頁訪問,HttpRequest,HttpResponse相關的知識

【經驗總結】Http,網頁訪問,HttpRequest,HttpResponse相關的知識

以下記錄自己在用C#語言,實現網頁內容抓取,模擬登陸網頁等過程中,所從無到有,一點點知道的一些知識,記錄下來,以供參考(高手不要笑哈):

1.Host不是自己指定/設定的,而是http請求會自動去設定

用C#寫http請求的header中,開始以為Host也是自己設定的:

req.Headers.Add(“Host”, “login.live.com”);

結果發現無法設定,會出錯。

後來才知道,此Host值,是不需要程式操作,而是http的庫會自動設定的。

2.POST型別請求,除了填寫資料,還要設定ContentType 為application/x-www-form-urlencoded

如果是POST型別的http請求,那麼除了要提交對應的資料之外,還要設定對應的ContentType:

req.ContentType = “application/x-www-form-urlencoded”;

其中提交的資料,是quote編碼後的。

3.User-Agent很重要

在提交http請求的時候,User-Agent在很多時候,都很重要。至少我知道的有這些情況:

(1)用於識別不同瀏覽器,以實現不同的行為

看到關於User-Agent的解釋:

中介紹的,可能會有網頁程式碼實現,會考慮到識別對應的User-Agent,以得知當前所用瀏覽器型別,然後肯能會針對不同瀏覽器,有不同的行為或者網頁內容呈現。

(2)C#中http的response中的header中的Set-Cookie有誤

之前遇到過,User-Agent設定為:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7

結果http返回的response中的cookies,即resp.Cookies,就是錯誤的(注:該cookies是.NET(C#)庫所解析出來的)

而用其他一些User-Agent,比如:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E

就可以得到正確的resp.Cookies就是正確的。

所以,肯能有時候會遇到,不同的User-Agent,會導致一些莫名其妙的事情,比如這裡可能會導致.NET的解析Set-Cookie的bug出現和不出現。

關於該問題的詳情去看這裡:

4.Accept-Encoding設定為gzip,deflate會導致返回的html網頁是亂碼

具體詳情和解釋,去看這裡:

5.可以通過關閉“自動執行重定向”,以獲取重定向中所返回的cookie值

想要獲得對應的網頁重定向過程中,所返回的cookie,即

訪問地址A,結果內部過程是,伺服器收到A地址請求,其返回內容中包括了cookie,但是由於此A是重定向,導致最終我們所獲得的網頁內容是重定向之後的B地址的內容,而且對應的cookie,也是B地址的cookie,而無法獲得重定向之前A地址所返回的cookie,所以,想要獲得A地址的cookie,即重定向過程中的cookie值,

對於C#程式碼,可以通過

req.AllowAutoRedirect = false;

這樣就可以禁止重定向,可以獲得我們所需要的cookie了。

然後再手動去再次提交http請求去訪問B地址,即可完整模擬整個重定向的過程。

更加詳細的解釋去看這裡:

6.分析網頁執行過程,目前已經好用的工具有IE9的F12和Chrome的”開發人員工具”

具體用法和功能特點比較,參見:

另外聽說對於FireFox下面,也有分析網頁的工具:

FireBug + Web Developer

有機會也去試試。

6.如果模擬網頁登陸,那麼很可能要用到對應的cookie,其中包含了認證的資訊

如果模擬網站登陸,那麼基本邏輯都是,填寫了使用者名稱和密碼,以及相關資料,編碼後,然後用POST方法提交請求,伺服器返回的認證資訊,一般都包含在對應的cookie中,所以,如果管理和分析cookie,就很重要。

(1)關於如果訪問網頁,可以參考這裡:

Retrieving HTTP content in .NET

其中就有關於cookie的管理功能,如何提交POST資料。

(2)然後我參考其程式碼,也實現了對應的一些函式,感興趣的可以去這裡看程式碼:

(3)關於cookie的知識,去看wiki:

7.C#中,如果cookie的Domain為空,那麼會導致HttpWebRequest的CookieContainer.Add死掉

在用C#實現模擬登陸網站的除錯過程中,遇到了很多次,都是不小心,將對應的domain為空的cookie,新增到了CookieContainer中,比如這樣的程式碼:

req.CookieContainer.Add(skydriveCookies);

其中skydriveCookies是CookieCollection型別,其中某個cookie的Domain為空,則此行程式碼一執行,就死掉了,也沒有報任何錯誤,在這點上,VS2010做得很是不好,也沒有任何提示。

而最後還是N次的除錯,比較,排除,最後才確定程式碼死掉的原因,是某個Cookie的Domain為空,所導致的。

所以,千萬千萬要注意,在獲得resp.Cookies或者是解析出來的Cookie的話,一定要保證Domain不為空,然後呼叫CookieContainer.Add才能保證不會死掉。