HttpClient, 使用C#操作Web
生活随笔
收集整理的這篇文章主要介紹了
HttpClient, 使用C#操作Web
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我們知道, .Net類庫里提供了HttpWebRequest等類,方便我們編程與Web服務(wù)器進行交互. 但是實際使用中我們經(jīng)常會遇到以下需求,基礎(chǔ)類里沒有直接提供相應(yīng)的功能(WebClient類包含這些功能,只是用起來稍微麻煩一點--謝謝網(wǎng)友東吳居士的提醒):
- 對HttpWebResponse獲取的HTML進行文字編碼轉(zhuǎn)換,使之不會出現(xiàn)亂碼;
- 自動在Session間保持Cookie,Referer等相關(guān)信息;
- 模擬HTML表單提交;
- 向服務(wù)器上傳文件;
- 對二進制的資源,直接獲取返回的字節(jié)數(shù)組(byte[]),或者保存為文件
為了解決這些問題,我開發(fā)了HttpClient類.下面是使用的方法:
- 獲取編碼轉(zhuǎn)換后的字符串
HttpClient client=new HttpClient(url);
string html=client.GetString();
GetString()函數(shù)內(nèi)部會查找Http Headers, 以及HTML的Meta標簽,試圖找出獲取的內(nèi)容的編碼信息.如果都找不到,它會使用client.DefaultEncoding, 這個屬性默認為utf-8, 也可以手動設(shè)置. - 自動保持Cookie, Referer
HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();
這里HttpClient的第三個參數(shù),keepContext設(shè)置為真時,HttpClient會自動記錄每次交互時服務(wù)器對Cookies進行的操作,同時會以前一次請求的Url為Referer.在這個例子里,獲取html2時,會把url1作為Referer, 同時會向服務(wù)器傳遞在獲取html1時服務(wù)器設(shè)置的Cookies. 當然,你也可以在構(gòu)造HttpClient時直接提供第一次請求要發(fā)出的Cookies與Referer:
HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);
或者,在使用過程中隨時修改這些信息:
client.Context.Cookies=cookies;
client.Context.referer=referer; - 模擬HTML表單提交
HttpClient client=new HttpClient(url);
client.PostingData.Add(fieldName1, filedValue1);
client.PostingData.Add(fieldName2, fieldValue2);
string html=client.GetString();
上面的代碼相當于提交了一個有兩個input的表單. 在PostingData非空,或者附加了要上傳的文件時(請看下面的上傳和文件), HttpClient會自動把HttpVerb改成POST, 并將相應(yīng)的信息附加到Request上. - 向服務(wù)器上傳文件
HttpClient client=new HttpClient(url);
client.AttachFile(fileName, fieldName);
client.AttachFile(byteArray, fileName, fieldName);
string html=client.GetString();
這里面的fieldName相當于<input type="file" name="fieldName" />里的fieldName. fileName當然就是你想要上傳的文件路徑了. 你也可以直接提供一個byte[] 作為文件內(nèi)容, 但即使如此,你也必須提供一個文件名,以滿足HTTP規(guī)范的要求. - 不同的返回形式
字符串: string html = client.GetString();
流: Stream stream = client.GetStream();
字節(jié)數(shù)組: byte[] data = client.GetBytes();
保存到文件:? client.SaveAsFile(fileName);
或者,你也可以直接操作HttpWebResponse: HttpWebResponse res = client.GetResponse();
每調(diào)用一次上述任何一個方法,都會導致發(fā)出一個HTTP Request, 也就是說,你不能同時得到某個Response的兩種返回形式.
另外,調(diào)用后它們?nèi)我庖粋€之后,你可以通過client.ResponseHeaders來獲取服務(wù)器返回的HTTP頭. - 下載資源的指定部分(用于斷點續(xù)傳,多線程下載)
HttpClient client=new HttpClient(url);
//發(fā)出HEAD請求,獲取資源長度
int length=client.HeadContentLength();
//只獲取后一半內(nèi)容
client.StartPoint=length/2;
byte[] data=client.GetBytes();
HeadContentLength()只會發(fā)出HTTP HEAD請求.根據(jù)HTTP協(xié)議, HEAD與GET的作用等同, 但是,只返回HTTP頭,而不返回資源主體內(nèi)容. 也就是說,用這個方法,你沒法獲取一個需要通過POST才能得到的資源的長度,如果你確實有這樣的需求,建議你可以通過GetResponse(),然后從ResponseHeader里獲取Content-Length.
計劃中還有另外一些功能要加進來,比如斷點續(xù)傳, 多線程下載, 下載進度更新的事件機制等, 正在思考如何與現(xiàn)在的代碼融合到一起,期待你的反饋.
你可以從這里下載目前版本的全部代碼.
注意:使用時應(yīng)該添加對System.Web.dll的引用,并在使用此類的代碼前添加"using System.Web;",不然會無法通過編譯(感謝Hyke的提醒).
[update:2007年8月11日]
- 修復了一個與文件上傳相關(guān)的bug;
- 聽從大家的意見,給公開方法和屬性添加了XML注釋;
- 添加了斷點續(xù)傳的支持功能(還需要考慮一下怎么做能讓使用更方便).
- 修復了一個與Post相關(guān)的bug
總結(jié)
以上是生活随笔為你收集整理的HttpClient, 使用C#操作Web的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone13或将支持Wi-Fi6E技
- 下一篇: 数字签名时间戳服务器的原理 !