您好,登錄后才能下訂單哦!
很多時候,我們項目需要其他網(wǎng)站的資源,而這個被請求的網(wǎng)站可能屬于你們自己開發(fā)管理的網(wǎng)站。也可能是公網(wǎng)上其他網(wǎng)站對外開發(fā)的API接口,比如說騰訊的微信公眾平臺的API接口、各大短信服務(wù)商的短信API接口等。
為了上述的功能效果,我們就需要了解Asp.Net中的兩個相關(guān)類,一個是HttpWebRequest類,另一個是HttpWebResponse類。
下面對這兩個類進行簡要概述下:
HttpWebRequest類:提供支持的屬性和方法中定義WebRequst以及其他屬性和方法,使用戶直接通過 HTTP 與服務(wù)器交互。
HttpWebResponse類:用于生成 HTTP 獨立客戶端應(yīng)用程序發(fā)送 HTTP 請求和接收 HTTP 響應(yīng)。
既然了解了上述兩個類的作用,那我們就可以通過設(shè)置Post或者Get方式的請求參數(shù),給定指定的url地址鏈接,我們就可以對目標網(wǎng)站的接口發(fā)起Http請求,獲取我們想要的數(shù)據(jù)。
下面是使用HttpWebRequest和HttpWebResponse類封裝的一個請求類,讀者可自行復(fù)制即可使用,封裝了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>
/// 創(chuàng)建GET方式的HTTP請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param>
/// <param name="cookies">隨同HTTP請求發(fā)送的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>
/// 創(chuàng)建POST方式的HTTP請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="parameters">隨同請求POST的參數(shù)名稱及參數(shù)值字典</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param>
/// <param name="requestEncoding">發(fā)送HTTP請求時所用的編碼</param>
/// <param name="cookies">隨同HTTP請求發(fā)送的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;
//如果是發(fā)送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數(shù)據(jù)
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個封裝的方法,我們下面就模擬下登錄自己的站點,先分析自己的網(wǎng)站demo登錄實例,分析出需要傳遞的Post參數(shù)。如何分析此處不詳細闡述,請讀者自行查閱資料。
/// <summary>
/// 模擬登錄網(wǎng)站,并獲取cookie
/// </summary>
public static void Request3()
{
string loginUrl = "博主某網(wǎng)站域名登錄域名/login";
string userName = "userName";
string password = "password";
string tagUrl = "博主某網(wǎng)站域名" + userName + "/token";<br> //設(shè)置編碼方式
Encoding encoding = Encoding.GetEncoding("gb2312");
<br> //此處設(shè)置Post請求的參數(shù)
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("參數(shù)1", "fa");
parameters.Add("參數(shù)2", "fa");
parameters.Add("參數(shù)3", tagUrl);
parameters.Add("參數(shù)4", "0");
parameters.Add("username", userName);
parameters.Add("password", password);<br> //通過CreatePostHttpResponse方式請求登錄的接口
HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(loginUrl, parameters, null, null, encoding, null);<br> //獲取返回數(shù)據(jù)中的Cookie設(shè)置值。
string cookieString = response.Headers["Set-Cookie"];
//后續(xù)你想做的其他操作
}
接上面Request3的方法,登錄成功后,獲取到登錄后的cookie,我們就可以通過在請求中帶上Cookie的方式去請求網(wǎng)站的其他資源信息。下面這個方法就是通過Get請求獲取相應(yīng)網(wǎng)站頁面數(shù)據(jù),方法如下:
public static void Request4()
{
string tagUrl = "登錄后可訪問的某些Get請求的URL地址";
CookieCollection cookies = new CookieCollection();//如何從response.Headers["Set-Cookie"];中獲取并設(shè)置CookieCollection的代碼略,參照博文上一段
var response = HttpWebResponseUtility.CreateGetHttpResponse(tagUrl, null, null, cookies);
}
如果我們通過模擬網(wǎng)頁請求獲取到的是網(wǎng)頁HTML數(shù)據(jù),我們就可以通過分析網(wǎng)頁文檔中的Dom結(jié)構(gòu)等獲取相應(yīng)的數(shù)據(jù),分析出你需要的信息。
如果獲取的數(shù)據(jù)是Json數(shù)據(jù),那個這個數(shù)據(jù)就更直接簡單明了,分析Json字符串每個字段的含義即可了,后續(xù)的操作就根據(jù)你的項目業(yè)務(wù)邏輯進行編寫。
網(wǎng)上很多網(wǎng)站開放的API接口返回的數(shù)據(jù)就是Json字符串,比如一些網(wǎng)站提供的短信服務(wù)接口,接口返回數(shù)據(jù)就是Json字符串,返回的數(shù)據(jù)中絕對有一個字段告知你短信是否發(fā)送成功。
當(dāng)然,還有些網(wǎng)站接口返回的數(shù)據(jù)是XML格式,這些就留給讀者自行去研究了。
最后提下HTTP請求分析工具,你可以使用谷歌瀏覽器自帶的F12調(diào)試功能進行分析,可以分析出請求的參數(shù)列表、返回的數(shù)據(jù)、Cookie數(shù)據(jù)等。
也可使用專業(yè)的抓包工具,如PostMan,fiddler等,這兩種工具對于網(wǎng)站API接口開發(fā)人員來說是常用的工具,可以不用寫代碼,輕松自定義請求參數(shù)快捷測試網(wǎng)站API接口。
最后,附上博主的IT技術(shù)學(xué)習(xí)群,歡迎各位同行入群指導(dǎo)交流。技術(shù)群:872894940
更多文章可以關(guān)注博主個人站點:IT技術(shù)小趣屋。
博主個人技術(shù)交流群:960640092,博主微信公眾號如下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。