获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现
文章來自http://www.cnblogs.com/deerchao/archive/2007/08/09/849361.html
使用
?HttpClient client = new HttpClient("[登陸頁面地址]?username=aaa&password=bbb", null, true); //最后一個(gè)參數(shù)true,表示保存返回的Cookies,
string html=client.GetString();//發(fā)出請求,返回結(jié)果字符串;
client.url=searchurl; //searchurl為查詢頁面,在該url后連上對應(yīng)的查詢條件即可完成查詢
string html=client.GetString();
然后可以通過正則表達(dá)式,根據(jù)指定的字符串模型返回需要的部分
??????? /// <summary>
??????? /// 在源字符串中查找前置字符串為left,后置字符串為right的內(nèi)容
??????? /// </summary>
??????? /// <param name="source">源字符串</param>
??????? /// <param name="condition">條件字符串,由前置字符串+<%%>+后置字符串組成</param>
??????? /// <param name="right">后置字符串</param>
??????? /// <param name="index">要返回的結(jié)果集合中的子項(xiàng)</param>
??????? /// <returns></returns>
??????? public static string FindSubString(string source,string condition,int index)
??????? {
??????????? string regexString = condition.Replace("<%%>", @"([\s\S]*?)");
??????????? Match m = null;
??????????? m = Regex.Match(source, regexString);
??????????? return? m.Groups[index].Value;
??????????
??????? }
獲取編碼轉(zhuǎn)換后的字符串
HttpClient client=new HttpClient(url);
string html=client.GetString();
GetString()函數(shù)內(nèi)部會(huì)查找Http Headers, 以及HTML的Meta標(biāo)簽,試圖找出獲取的內(nèi)容的編碼信息.如果都找不到,它會(huì)使用client.DefaultEncoding, 這個(gè)屬性默認(rèn)為utf-8, 也可以手動(dòng)設(shè)置.
自動(dòng)保持Cookie, Referer
HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();
這里HttpClient的第三個(gè)參數(shù),keepContext設(shè)置為真時(shí),HttpClient會(huì)自動(dòng)記錄每次交互時(shí)服務(wù)器對Cookies進(jìn)行的操作,同時(shí)會(huì)以前一次請求的Url為Referer.在這個(gè)例子里,獲取html2時(shí),會(huì)把url1作為Referer, 同時(shí)會(huì)向服務(wù)器傳遞在獲取html1時(shí)服務(wù)器設(shè)置的Cookies. 當(dāng)然,你也可以在構(gòu)造HttpClient時(shí)直接提供第一次請求要發(fā)出的Cookies與Referer:
HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);
或者,在使用過程中隨時(shí)修改這些信息:
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();
上面的代碼相當(dāng)于提交了一個(gè)有兩個(gè)input的表單. 在PostingData非空,或者附加了要上傳的文件時(shí)(請看下面的上傳和文件), HttpClient會(huì)自動(dòng)把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相當(dāng)于<input type="file" name="fieldName" />里的fieldName. fileName當(dāng)然就是你想要上傳的文件路徑了. 你也可以直接提供一個(gè)byte[] 作為文件內(nèi)容, 但即使如此,你也必須提供一個(gè)文件名,以滿足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)用一次上述任何一個(gè)方法,都會(huì)導(dǎo)致發(fā)出一個(gè)HTTP Request, 也就是說,你不能同時(shí)得到某個(gè)Response的兩種返回形式.
另外,調(diào)用后它們?nèi)我庖粋€(gè)之后,你可以通過client.ResponseHeaders來獲取服務(wù)器返回的HTTP頭.
下載資源的指定部分(用于斷點(diǎn)續(xù)傳,多線程下載)
HttpClient client=new HttpClient(url);
//發(fā)出HEAD請求,獲取資源長度
int length=client.HeadContentLength();
//只獲取后一半內(nèi)容
client.StartPoint=length/2;
byte[] data=client.GetBytes();
HeadContentLength()只會(huì)發(fā)出HTTP HEAD請求.根據(jù)HTTP協(xié)議, HEAD與GET的作用等同, 但是,只返回HTTP頭,而不返回資源主體內(nèi)容. 也就是說,用這個(gè)方法,你沒法獲取一個(gè)需要通過POST才能得到的資源的長度,如果你確實(shí)有這樣的需求,建議你可以通過GetResponse(),然后從ResponseHeader里獲取Content-Length.
???????
轉(zhuǎn)載于:https://www.cnblogs.com/rexying/archive/2008/01/04/1026205.html
總結(jié)
以上是生活随笔為你收集整理的获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解C# 3.0的五项主要改进
- 下一篇: SQL之inner join/left