很多時候,我們項目需要其他網站的資源,而這個被請求的網站可能屬於你們自己開發管理的網站。也可能是公網上其他網站對外開發的API接口,比如說騰訊的微信公眾平台的API接口、各大短信服務商的短信API接口等。
為了上述的功能效果,我們就需要了解Asp.Net中的兩個相關類,一個是HttpWebRequest類,另一個是HttpWebResponse類。
下面對這兩個類進行簡要概述下:
HttpWebRequest類:提供支持的屬性和方法中定義WebRequst以及其他屬性和方法,使用戶直接通過 HTTP 與服務器交互。
HttpWebResponse類:用於生成 HTTP 獨立客戶端應用程序發送 HTTP 請求和接收 HTTP 響應。
既然了解了上述兩個類的作用,那我們就可以通過設置Post或者Get方式的請求參數,給定指定的url地址鏈接,我們就可以對目標網站的接口發起Http請求,獲取我們想要的數據。
下面是使用HttpWebRequest和HttpWebResponse類封裝的一個請求類,讀者可自行復制即可使用,封裝了Get請求和Post請求。具體的代碼如下:
public class HttpWebResponseUtility { private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; /// <summary> /// 創建GET方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } return request.GetResponse() as HttpWebResponse; } /// <summary> /// 創建POST方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的參數名稱及參數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="requestEncoding">發送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是發送HTTPS請求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } //如果需要POST數據 if (!(parameters == null || parameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return request.GetResponse() as HttpWebResponse; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //總是接受 } }
有了上面2個封裝的方法,我們下面就模擬下登錄自己的站點,先分析自己的網站demo登錄實例,分析出需要傳遞的Post參數。如何分析此處不詳細闡述,請讀者自行查閱資料。
/// <summary> /// 模擬登錄網站,並獲取cookie /// </summary> public static void Request3() { string loginUrl = "博主某網站域名登錄域名/login"; string userName = "userName"; string password = "password"; string tagUrl = "博主某網站域名" + userName + "/token";
//設置編碼方式 Encoding encoding = Encoding.GetEncoding("gb2312");
//此處設置Post請求的參數 IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("參數1", "fa"); parameters.Add("參數2", "fa"); parameters.Add("參數3", tagUrl); parameters.Add("參數4", "0"); parameters.Add("username", userName); parameters.Add("password", password);
//通過CreatePostHttpResponse方式請求登錄的接口 HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(loginUrl, parameters, null, null, encoding, null);
//獲取返回數據中的Cookie設置值。 string cookieString = response.Headers["Set-Cookie"]; //后續你想做的其他操作 }
接上面Request3的方法,登錄成功后,獲取到登錄后的cookie,我們就可以通過在請求中帶上Cookie的方式去請求網站的其他資源信息。下面這個方法就是通過Get請求獲取相應網站頁面數據,方法如下:
public static void Request4() { string tagUrl = "登錄后可訪問的某些Get請求的URL地址"; CookieCollection cookies = new CookieCollection();//如何從response.Headers["Set-Cookie"];中獲取並設置CookieCollection的代碼略,參照博文上一段 var response = HttpWebResponseUtility.CreateGetHttpResponse(tagUrl, null, null, cookies); }
如果我們通過模擬網頁請求獲取到的是網頁HTML數據,我們就可以通過分析網頁文檔中的Dom結構等獲取相應的數據,分析出你需要的信息。
如果獲取的數據是Json數據,那個這個數據就更直接簡單明了,分析Json字符串每個字段的含義即可了,后續的操作就根據你的項目業務邏輯進行編寫。
網上很多網站開放的API接口返回的數據就是Json字符串,比如一些網站提供的短信服務接口,接口返回數據就是Json字符串,返回的數據中絕對有一個字段告知你短信是否發送成功。
當然,還有些網站接口返回的數據是XML格式,這些就留給讀者自行去研究了。
最后提下HTTP請求分析工具,你可以使用谷歌瀏覽器自帶的F12調試功能進行分析,可以分析出請求的參數列表、返回的數據、Cookie數據等。
也可使用專業的抓包工具,如PostMan,fiddler等,這兩種工具對於網站API接口開發人員來說是常用的工具,可以不用寫代碼,輕松自定義請求參數快捷測試網站API接口。
最后,附上博主的IT技術學習群,歡迎各位同行入群指導交流。技術群:960640092
更多文章可以關注博主個人站點:IT技術小屋。博主公眾號如下: