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

更多文章可以关注博主个人站点:IT技术小屋。

转载于:https://www.cnblogs.com/xu-yi/p/10061342.html

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

  1. Flutter-防京东商城项目-创建商品数据模型 、请求Api接口渲染热门商品 推荐商品 获取数据然后模型赋值-06

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  2. Maven构建Java使用代理,请求API接口

    Maven构建Java使用代理,请求API接口 提示:代理请求访问,请合法使用,谢谢 环境: Maven:Maven官网 HuTool:HuTool官网 Java8: Java官网-Oracle Id ...

  3. 过去别人小程序接口php,小程序请求API接口PHPSESSID变化的解决方式

    搜索热词 惠民小程序小编了解到,微信小程序成为当下热门话题,下面从多个方面来谈谈小程序请求API接口PHPSESSID变化的解决方式. 最新消息, 4月18日,腾讯在北京召开发布会,宣布将腾讯文档作为 ...

  4. Tomcat 配置 项目 到tomcat目录外面 和 域名绑定访问(api接口、前端网站、后台管理网站)...

    先停止tomcat服务 1.进入apache-tomcat-7.0.68/conf/Catalina/localhost(如果之前还都没有启动过tomcat,是不会有此目录的,先启动一次再关闭,会自动 ...

  5. Python 调用有道翻译api接口翻译外文网站的整篇西班牙文实战演示

    Python 调用有道翻译 api 接口翻译整篇西班牙文实战演示 第一章:翻译效果展示 ① 翻译文章示例一[阿尔卡拉门的无海摩纳哥:"不到4万欧元,你就不能在这里租任何东西."] ...

  6. php模拟安卓端捉取数据,ios - PHP如何模拟安卓设备,请求API接口的数据

    抓包获取的安卓设备请求API时候携带了这么一大堆数据,PHP如何模拟这些数据? customerId: 801 clientAgent: M351#1080*1800 versionId: 5.6.2 ...

  7. java通过http方式代理请求api接口

    最近在对接客户那边第三方合作的http api接口的时候,发现通过java代码的方式请求第三方http接口,发现在我本地可以正常访问,但是把程序部署到客户那边的服务器上就发生超时,找不到访问地址的错误 ...

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

    前提:安装好nginx,如果已经启动nginx,先停止,命令: ./usr/local/nginx/sbin/nginx -s stop 修改nginx配置 vi /usr/local/nginx/c ...

  9. Laravel POST请求API接口 使用validate表单验证返回欢迎页

    突然遇到的问题  就是使用Laravel进行开发API接口的时候  发现在表单验证不通过的时候返回了登录页 猜测问题应该是因为表单验证失败后进行了重定向导致的 因为返回状态码200 网上找了好久没找到 ...

最新文章

  1. Centos7.x系统配置上的变化【转】
  2. 洞察|一图看懂AI新基建如何落地
  3. dos 一行两条命令
  4. 小猿圈web前端之网站性能优化方案
  5. stm32烧录软件_使用华为LiteOS Studio开发STM32物联网工程1
  6. Kafka核心源码解析 - LogManager源码解析
  7. VirtualBox下安装MacOS11
  8. [文摘20100706】软件架构师应该知道的97件事
  9. 《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务
  10. 【光学】基于matlab GUI光栅实验【含Matlab源码 1176期】
  11. php简单排课_基于PHP+MYSOL教务排课系统的设计与实现.pdf
  12. kali安装网易云1.1和打不开问题解决
  13. 2021各厂免费云服务器申请攻略(阿里云/腾讯云/华为云)
  14. ajax上传图片到又拍云,又拍云存储(UpYun)的.NET Core填坑
  15. 卫生事业单位计算机科学与技术,卫生事业单位考试计算机科学与技术学习知识点.docx...
  16. 涪陵创新计算机学校2015元旦晚会,喜报:重庆市涪陵信息技术学校2019高考再续辉煌...
  17. 后缀自动机+DP BZOJ 3238 差异
  18. 运行patsy 时报错 assert pytype not in (tokenize.NL, tokenize.NEWLINE)
  19. ncl批量处理多个nc文件_利用MATLAB读取NC文件并绘图
  20. Android studio 使用androidX后应用启动log中报Didn‘t find class “android.view.View$OnUnhandledKeyEventListener“

热门文章

  1. 同一台服务器上面安装多个mysql数据库
  2. 全国四分之三的光伏电站市场面临较大投资风险
  3. javascript中闭包的一些理解
  4. Kafka Zero-Copy 使用分析
  5. 电路与电子学-第一章直流电路分析方法小概括
  6. Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明
  7. WordPress 运行流程分析
  8. 设计模式16——Memento设计模式
  9. RHEL在戴尔系统上p1p1 ......命名规则
  10. cursor的moveToNext()与moveToFirst()