使用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";<br> //設置編碼方式
Encoding encoding = Encoding.GetEncoding("gb2312");
<br> //此處設置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);<br> //通過CreatePostHttpResponse方式請求登錄的接口
HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(loginUrl, parameters, null, null, encoding, null);<br> //獲取返回數據中的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技術小趣屋

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