日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现

發布時間:2024/8/5 编程问答 117 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章來自http://www.cnblogs.com/deerchao/archive/2007/08/09/849361.html

使用
?HttpClient client = new HttpClient("[登陸頁面地址]?username=aaa&password=bbb", null, true); //最后一個參數true,表示保存返回的Cookies,
string html=client.GetString();//發出請求,返回結果字符串;
client.url=searchurl; //searchurl為查詢頁面,在該url后連上對應的查詢條件即可完成查詢
string html=client.GetString();

然后可以通過正則表達式,根據指定的字符串模型返回需要的部分

??????? /// <summary>
??????? /// 在源字符串中查找前置字符串為left,后置字符串為right的內容
??????? /// </summary>
??????? /// <param name="source">源字符串</param>
??????? /// <param name="condition">條件字符串,由前置字符串+<%%>+后置字符串組成</param>
??????? /// <param name="right">后置字符串</param>
??????? /// <param name="index">要返回的結果集合中的子項</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;
??????????
??????? }




獲取編碼轉換后的字符串

HttpClient client=new HttpClient(url);
string html=client.GetString();

GetString()函數內部會查找Http Headers, 以及HTML的Meta標簽,試圖找出獲取的內容的編碼信息.如果都找不到,它會使用client.DefaultEncoding, 這個屬性默認為utf-8, 也可以手動設置.

自動保持Cookie, Referer

HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();

這里HttpClient的第三個參數,keepContext設置為真時,HttpClient會自動記錄每次交互時服務器對Cookies進行的操作,同時會以前一次請求的Url為Referer.在這個例子里,獲取html2時,會把url1作為Referer, 同時會向服務器傳遞在獲取html1時服務器設置的Cookies. 當然,你也可以在構造HttpClient時直接提供第一次請求要發出的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, 并將相應的信息附加到Request上.

向服務器上傳文件

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[] 作為文件內容, 但即使如此,你也必須提供一個文件名,以滿足HTTP規范的要求.

不同的返回形式

字符串: string html = client.GetString();
流: Stream stream = client.GetStream();
字節數組: byte[] data = client.GetBytes();
保存到文件:? client.SaveAsFile(fileName);
或者,你也可以直接操作HttpWebResponse: HttpWebResponse res = client.GetResponse();

每調用一次上述任何一個方法,都會導致發出一個HTTP Request, 也就是說,你不能同時得到某個Response的兩種返回形式.
另外,調用后它們任意一個之后,你可以通過client.ResponseHeaders來獲取服務器返回的HTTP頭.
下載資源的指定部分(用于斷點續傳,多線程下載)

HttpClient client=new HttpClient(url);
//發出HEAD請求,獲取資源長度
int length=client.HeadContentLength();

//只獲取后一半內容
client.StartPoint=length/2;
byte[] data=client.GetBytes();

HeadContentLength()只會發出HTTP HEAD請求.根據HTTP協議, HEAD與GET的作用等同, 但是,只返回HTTP頭,而不返回資源主體內容. 也就是說,用這個方法,你沒法獲取一個需要通過POST才能得到的資源的長度,如果你確實有這樣的需求,建議你可以通過GetResponse(),然后從ResponseHeader里獲取Content-Length.

???????

轉載于:https://www.cnblogs.com/rexying/archive/2008/01/04/1026205.html

總結

以上是生活随笔為你收集整理的获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。