Http請求之 WebClient

WebClient
    Mircsoft在dotnet1.1框架下提供的向 URI 標識的資源發送數據和從 URI 標識的資源接收數據的公共方法。
通過這個類,大家可以在脫離瀏覽器的基礎上模擬瀏覽器對互聯網上的資源的訪問和發送信息。
    WebClient類不能被繼承,在dotnet1.1框架中已經爲我們提供了WebRequest和WebResponse兩個強大的類來
處理向URI標示的資源和獲取數據了。然後,不足的是利用WebRequest和WebResponse時設置過於複雜。
使用起來頗爲費勁。於是乎有了現在的WebClient,WebClient其實可以理解爲對WebRequest和WebResponse等
協作的封裝。它使人們使用起來更加簡單方便,然後它也有先天不足的地方。那就是缺少對cookies/session的
支持,用戶無法對是否自動url轉向的控制,還有就是缺少對代理服務器的支持。關於session/url轉向控制/代理
服務器的使用我將在以後關於WebRequest/WebResponse的話題裏面向大家介紹。下面先給大家簡單介紹一
下WebClinet類。

  類名:WebClient
  命名空間System.Net.WebClient

公共構造函數

WebClient 構造函數 初始化 WebClient 類的新實例。

公共屬性

BaseAddress 獲取或設置 WebClient 發出請求的基 URI。
Container (從 Component 繼承) 獲取 IContainer ,它包含 Component
Credentials 獲取或設置用於對向 Internet 資源的請求進行身份驗證的網絡憑據。
Headers 獲取或設置與請求關聯的標頭名稱/值對集合。
QueryString 獲取或設置與請求關聯的查詢名稱/值對集合。
ResponseHeaders 獲取與響應關聯的標頭名稱/值對集合。
Site (從 Component 繼承) 獲取或設置 ComponentISite

公共方法

CreateObjRef (從 MarshalByRefObject 繼承) 創建一個對象,該對象包含生成用於與遠程對象進行通訊的代理所需的全部相關信息。
Dispose (從 Component 繼承) 已重載。釋放由 Component 佔用的資源。
DownloadData 從具有指定 URI 的資源下載數據。
DownloadFile 從具有指定 URI 的資源將數據下載到本地文件。
Equals (從 Object 繼承) 已重載。確定兩個 Object 實例是否相等。
GetHashCode (從 Object 繼承) 用作特定類型的哈希函數,適合在哈希算法和數據結構(如哈希表)中使用。
GetLifetimeService (從 MarshalByRefObject 繼承) 檢索控制此實例的生存期策略的當前生存期服務對象。
GetType (從 Object 繼承) 獲取當前實例的 Type
InitializeLifetimeService (從 MarshalByRefObject 繼承) 獲取控制此實例的生存期策略的生存期服務對象。
OpenRead 爲從具有指定 URI 的資源下載的數據打開一個可讀的流。
OpenWrite 已重載。打開一個流以將數據寫入具有指定 URI 的資源。
ToString (從 Object 繼承) 返回表示當前 ObjectString
UploadData 已重載。將數據緩衝區上載到具有指定 URI 的資源。
UploadFile 已重載。將本地文件上載到具有指定 URI 的資源。
UploadValues 已重載。將名稱/值集合上載到具有指定 URI 的資源。


從上表中我們可以看到WebClient提供四種將數據上載到資源的方法:
  • OpenWrite 返回一個用於將數據發送到資源的 Stream
  • UploadData 將字節數組發送到資源並返回包含任何響應的字節數組。
  • UploadFile 將本地文件發送到資源並返回包含任何響應的字節數組。
  • UploadValuesNameValueCollection 發送到資源並返回包含任何響應的字節數組。

另外WebClient還提供三種從資源下載數據的方法:


  下面我們將通過一個簡單的應用程序來測試WebClient的最簡單用法作爲本小節的結束讓大家對WebClient有個初步的認識
  
   例子1:利用WebClient實現對博客園首頁的訪問
  
    首先我們用HttpLook對這次訪問進行分析,爲了方便分析我特別將瀏覽器對圖片的訪問去掉 讓我們能看到更簡便的分析結果
   
     我們可以看到整個過程中我們發起了4次資源請求,其中第一次是對博客園首頁進行訪問
     第二次訪問的是樣式表文件,第三和四次訪問的是js腳本。
     我們點擊第一項可以看見關於這次資源訪問的http頭部信息,所謂http頭部就是我們不能看見的瀏覽器和遠程服務器傳遞的一些不可見元素。

1 GET / HTTP/ 1.1
2 Accept: image/gif ,  image/x-xbitmap ,  image/jpeg ,  image/pjpeg ,  application/x-shockwave-flash ,  application/vnd.ms-excel ,  application/vnd.ms-powerpoint ,  application/msword ,  */*
3 Accept-Language: zh-cn
4 UA-CPU: x86
5 Accept-Encoding: gzip ,  deflate
6 User-Agent: Mozilla/ 4.0  (compatible ;  MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
7 Host: www.cnblogs.com
8 Connection: Keep-Alive
9 Cookie: .DottextCookie = (隱藏)

  這些http信息包含了瀏覽器訪問的過程。其中
  第一行:請求地址的相對路徑和使用協議 相對路徑爲/ 協議採用http1.1
  第二行:表示我們請求的資源種類。
  第三行:我們的語言是簡體中文。
  第四行:我們使用的cup結構。這個http頭在一般的網頁中並不過見。估計是博客園的一次調查??
  第五行:標示採用gzip方式壓縮html編碼進行傳遞。只有一些瀏覽器支持的gzip解壓縮時採用這種方式傳遞文本。由於我們
  要寫的程序不具備gzi解壓縮的能力 所以我們不考慮使用這種方式發送請求。
  第六行:瀏覽器說明
  第七行:當前主機地址
  第八行:連接請求狀態
  第九行:cookies信息
 
  我在新建的應用程序裏面利用WebClient來實現這了一過程。
  
  下面我將就關鍵實現做一些解釋

 1 WebClient _client = new  WebClient();
 2             _client.BaseAddress = " http://www.cnblogs.com " ;
 3             _client.Headers.Add( " Accept " , " image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* " );
 4             _client.Headers.Add( " Accept-Language " , " zh-cn " );
 5             _client.Headers.Add( " UA-CPU " , " x86 " );
 6              // _client.Headers.Add("Accept-Encoding","gzip, deflate");
 7             _client.Headers.Add( " User-Agent " , " Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) " );
 8             System.IO.Stream objStream = _client.OpenRead( " / " );
 9             System.IO.StreamReader _read = new  System.IO.StreamReader(objStream,System.Text.Encoding.UTF8);
10             textBox1.Text = _read.ReadToEnd();


  第一行:新建一個WebClient 實例_client
  第二行~第七行:將上邊捕捉到的Http頭部放入到_client實例,注意第六行的被註釋掉了。因爲我們的程序無法進行gzip解碼所以如果這樣請求
  獲得的資源可能無法解碼。當然我們可以給程序加入gzip處理的模塊 那是題外話了。
  第八行:利用_client.OpenRead(string URI)的方法獲取網上資源的Stream
  第九行:利用StreamReader將Stream用我們需要的編碼方法去解析。這裏使用了UTF8。對應不同的網站可以使用Default等不同的解碼方法。
  第十行:將我們解碼後的內容放到textBox1裏面顯示出來

  好了 大致關於WebClient的介紹就到這裏了。以後將爲大家陸續介紹WebClient的各種屬性和方法。
  利用WebClient做個資源小偷其實是很簡單的,所以大家一定要防盜鏈阿!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章