使用HttpWebRequest请求API接口以及其他网站资源
很多時候,我們項目需要其他網站的資源,而這個被請求的網站可能屬于你們自己開發管理的網站。也可能是公網上其他網站對外開發的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技術學習群,歡迎各位同行入群指導交流。技術群:872894940
更多文章可以關注博主個人站點:IT技術小屋。
轉載于:https://www.cnblogs.com/xu-yi/p/10061342.html
總結
以上是生活随笔為你收集整理的使用HttpWebRequest请求API接口以及其他网站资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 - 元组、集合
- 下一篇: Laravel中使用模型对数据进行操作