使用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技术学习群,欢迎各位同行入群指导交流。技术群:960640092
更多文章可以关注博主个人站点:IT技术小屋。博主公众号如下:

使用HttpWebRequest请求API接口以及其他网站资源的更多相关文章
- 通过HttpWebRequest请求https接口
一.为什么进行代理接口的开发: 有些项目需要访问被墙了哒网站,比如前不久公司开发项目需要使用google地图的接口,而google在中国被墙了,所有打算做一个代理接口服务,将代理放到国外服务器上,通过 ...
- 在线HTTP POST/GET模拟请求api接口http请求测试工具https://post.jsonin.com/
在线HTTP POST/GET模拟请求api接口http请求测试工具 在线POST/GET接口测试工具https://post.jsonin.com/ Json在线解析及格式化校验工具 https:/ ...
- php请求API接口方法
thinkphp下直接放入公共函数即可. /** * 通过URL获取页面信息 * @param string $url 地址 * @return string 返回页面信息 */ function g ...
- Tomcat 配置 项目 到tomcat目录外面 和 域名绑定访问(api接口、前端网站、后台管理网站)
先停止tomcat服务 1.进入apache-tomcat-7.0.68/conf/Catalina/localhost(如果之前还都没有启动过tomcat,是不会有此目录的,先启动一次再关闭,会自动 ...
- 使用js+Ajax请求API接口数据-带请求头方式
C# http请求带请求头部分 先上代码: <script type="text/javascript"> function zLoginCheck() { var A ...
- php curl 请求api 接口
官方文档curl : http://www.runoob.com/php/php-ref-curl.html php开启curl : ① 打开 php.ini 文件 extension=php_c ...
- nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
前提:安装好nginx,如果已经启动nginx,先停止,命令: ./usr/local/nginx/sbin/nginx -s stop 修改nginx配置 vi /usr/local/nginx/c ...
- Laravel POST请求API接口 使用validate表单验证返回欢迎页
突然遇到的问题 就是使用Laravel进行开发API接口的时候 发现在表单验证不通过的时候返回了登录页 猜测问题应该是因为表单验证失败后进行了重定向导致的 因为返回状态码200 网上找了好久没找到 ...
- Web Api HttpWebRequest 请求 Api 及 异常处理
HttpWebRequest request = WebRequest.CreateHttp(url); request.Method = "post"; request.Head ...
随机推荐
- kvm-qcow2派生镜像的远程备份的方法!
在虚拟化环境中,关于虚拟机的远程备份是一个比较重要的环节,这个是有关于整个机房挂掉之后,仍然可以恢复的最后一招. 在kvm中这种情况可以通过直接备份虚拟机的镜像文件(qcow2)到远端存储解决. 但有 ...
- Ubuntu英文变为中文
Ubuntu英文变为中文 注:(我也是第一次变语言,写的有点乱,我把重点的用红字表示.) 1.点击这个软件更新. 2.只有点击了上面那一步,这里才会软件资源 Software Sources ...
- Python ImportError: No module named 'requests'的解决方法
import requests报错 Python ImportError: No module named 'requests'可能是requests没有安装 安装流程 1.cmd 2.cd D:\p ...
- ansible 关闭ssh首次连接时提示
关闭ssh首次连接时提示. 修改/etc/ansible/ansible.cfg配置文件 方法一:(推荐,配置文件中存在) host_key_checking = False 方法二: ssh_arg ...
- spark wordcount 编程模型详解
spark wordcount中一共经历多少个RDD?以及RDD提供的toDebugString 在控制台输入spark-shell 系统会默认创建一个SparkContext sc h ...
- java 判断用户是PC端和还是APP端登陆
java 判断用户是PC端和还是APP端登陆 public void getRequestHeader(HttpServletRequest request){ // 从浏览器获取请求头信息 Stri ...
- 1-C++的并发世界
1.1 何谓并发 并发的两种方式 多核机器上的真正并行 单核机器的任务切换 并发的两种途径 多进程并发 1.1 多进程并发需要通过操作系统进行进程间通信 多线程并发 2.1 多线程并发需要共享内存 1 ...
- nodejs异步请求重试策略总结
对于node开发同学经常要处理异步请求,然后根据请求的结果或请求成功后的状态码做不同的策略处理,众多策略中最常用的一种就是重试策略.针对重试策略我们往往还需要设定一定的规则,如重试次数.重试时间间隔. ...
- VSCode插件开发全攻略(九)常用API总结
更多文章请戳VSCode插件开发全攻略系列目录导航. 本文提炼一些常见的API使用场景供参考,本文内容有待完善. 编辑器相关 修改当前激活编辑器内容 替换当前编辑器全部内容: vscode.windo ...
- nodejs常用代码片段
自动创建目录(多级) 相比起使用递归创建,调用 sheljsl 模块简单得多 const shell = require('shelljs') const fs = require('fs') if ...