1. 程式人生 > >使用HttpWebRequest請求API接口以及其他網站資源

使用HttpWebRequest請求API接口以及其他網站資源

pro 程序 代碼 屬性和方法 poi loginurl 求和 創建 2個

很多時候,我們項目需要其他網站的資源,而這個被請求的網站可能屬於你們自己開發管理的網站。也可能是公網上其他網站對外開發的API接口,比如說騰訊的微信公眾平臺的API接口、各大短信服務商的短信API接口等。

為了上述的功能效果,我們就需要了解Asp.Net中的兩個相關類,一個是HttpWebRequest類,另一個是HttpWebResponse類。

下面對這兩個類進行簡要概述下:

HttpWebRequest類:提供支持的屬性和方法中定義WebRequst以及其他屬性和方法,使用戶直接通過 HTTP 與服務器交互。

HttpWebResponse類:用於生成 HTTP 獨立客戶端應用程序發送 HTTP 請求和接收 HTTP 響應。

既然了解了上述兩個類的作用,那我們就可以通過設置Post或者Get方式的請求參數,給定指定的url地址鏈接,我們就可以對目標網站的接口發起Http請求,獲取我們想要的數據。

下面是使用HttpWebRequestHttpWebResponse類封裝的一個請求類,讀者可自行復制即可使用,封裝了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

使用HttpWebRequest請求API接口以及其他網站資源