使用HttpWebRequest请求API接口以及其他网站资源

很多时候,我们项目需要其他网站的资源,而这个被请求的网站可能属于你们自己开发管理的网站。也可能是公网上其他网站对外开发的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

原文地址:https://www.cnblogs.com/xu-yi/p/10061342.html

时间: 2024-08-03 09:02:06

使用HttpWebRequest请求API接口以及其他网站资源的相关文章

在线HTTP POST/GET模拟请求api接口http请求测试工具https://post.jsonin.com/

在线HTTP POST/GET模拟请求api接口http请求测试工具 在线POST/GET接口测试工具https://post.jsonin.com/ Json在线解析及格式化校验工具 https://jsonin.com/ 原文地址:https://www.cnblogs.com/daxiangxm/p/postjson.html

使用js+Ajax请求API接口数据-带请求头方式

先上代码: <script type="text/javascript"> function zLoginCheck() { var Account = 'admin; var Password = 'DC483E80A7A0BD9EF71D8CF973673924'; var str = { Account: Account, Password: Password } $.ajax({ type: "POST", url: '/Handle/zLogi

nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)

前提:安装好nginx,如果已经启动nginx,先停止,命令: ./usr/local/nginx/sbin/nginx -s stop 修改nginx配置 vi /usr/local/nginx/conf/nginx.conf 配置好以后的nginx.conf文件内容: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/er

微信小程序请求API接口PHPSESSID变化的解决方式

微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.request()造成的.如果直接使用浏览器请求并不会出现这种情况. 解决方式如下: 通过登录接口获取到用户的session_key 和 open_id,设置session信息如下: $3rd_session = md5(session_key . $open_id) $_SESSION[$3rd_sessi

nginx tcp 代理 kube api 接口请求报错

前提 Rke 完成k8s集群部署,测试各项功能正常后,在为master 添加vip,实现高可用,此时再次请求api接口报错: vip:172.20.101.252 master:172.20.101.157, 172.20.101.164, 172.20.101.165 报错: Unable to connect to the server: x509: certificate is valid for 172.20.101.157, 172.20.101.164, 172.20.101.165

各种快递查询Api接口(快递鸟)

前提 应用场景 可实现需求 申请Key 快递查询Api接口 接口文档及各开发语言Demo 查询Api接口定义 系统级输入参数 应用级输入参数 返回结果参数 请求JSON参数 响应JSON参数 查询Api接口使用 温馨提示 前提 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的是快递的查询Api及与其他各家的不同之处: 常用的提供快递Api接口的有: 快递鸟 快递100 爱查快递 等等 如大家使用过,快递100和爱查快递等等网站提供的快递查询等接口时,你会发现,你所申请的账号

web api接口同步和异步的问题

一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的操作. Q1.如果一个api接口很耗时,比如需要10s,会影响我的前端展示吗? --不会.很多js可以异步请求api接口,当接口返回数据时,通过回调方法,显示数据. Q2.对于存在耗时的api接口,使用异步api接口(接口内部可能使用 Task.Run 异步操作)一定可以提高响应吗? --不一定.举

ASP.NET Core 实战:构建带有版本控制的 API 接口

 一.前言 在上一篇的文章中,主要是搭建了我们的开发环境,同时创建了我们的项目模板框架.在整个前后端分离的项目中,后端的 API 接口至关重要,它是前端与后端之间进行沟通的媒介,如何构建一个 “好用” 的 API 接口,是需要我们后端人员好好思考的. 在系统迭代的整个过程中,不可避免的会添加新的资源,或是修改现有的资源,后端接口作为暴露给外界的服务,变动的越小,对服务的使用方造成的印象就越小,因此,如何对我们的 API 接口进行合适的版本控制,我们势必需要首先考虑. 系列目录地址:ASP.NET

钉钉服务端api接口使用

原文链接:http://www.cnblogs.com/xiaosongJiang/p/9991573.html 第一步:注册钉钉企业账号 打开链接:https://oa.dingtalk.com/#/login,注册账号即可 第二步:创建应用 以创建e应用为例: 还需要授权一个开发人员,并获取CorpSecret,需要把corpId和CorpSecret作为参数请求api接口获取AccessToken,后面的所有接口都需要AccessToken 第三步:接入接口 一.获取token 1 con