使用HttpWebRequest请求API接口以及其他网站资源
Posted firefox逍遥一下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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
以上是关于使用HttpWebRequest请求API接口以及其他网站资源的主要内容,如果未能解决你的问题,请参考以下文章
在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误:
请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest
C# API 调用不能与 HttpWebRequest 一起使用,但可以与 Postman 一起使用
GET 请求适用于 HttpWebRequest,Postman 。但不在 HttpClient 或 RestSharp 中