1. /// <summary>
  2. /// 用于以 POST 方式向目标地址提交表达数据
  3. /// 使用 application/x-www-form-urlencoded 编码方式
  4. /// 不支持上传文件, 若上传文件, 请使用<see cref="HttpPostFileRequestClient"/>
  5. /// </summary>
  6. public sealed class HttpPostRequestClient
  7. {
  8. #region - Private -
  9. private List<KeyValuePair<string, string>> _postDatas;
  10. #endregion
  11. /// <summary>
  12. /// 获取或设置数据字符编码, 默认使用<see cref="System.Text.Encoding.UTF8"/>
  13. /// </summary>
  14. public Encoding Encoding { get; set; } = Encoding.UTF8;
  15. /// <summary>
  16. /// 获取或设置 UserAgent
  17. /// </summary>
  18. public string UserAgent { get; set; } = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
  19. /// <summary>
  20. /// 获取或设置 Accept
  21. /// </summary>
  22. public string Accept { get; set; } = "*/*";
  23. /// <summary>
  24. /// 获取或设置 Referer
  25. /// </summary>
  26. public string Referer { get; set; }
  27. /// <summary>
  28. /// 获取或设置 Cookie 容器
  29. /// </summary>
  30. public CookieContainer CookieContainer { get; set; } = new CookieContainer();
  31. /// <summary>
  32. /// 初始化一个用于以 POST 方式向目标地址提交不包含文件表单数据<see cref="HttpPostRequestClient"/>实例
  33. /// </summary>
  34. public HttpPostRequestClient()
  35. {
  36. this._postDatas = new List<KeyValuePair<string, string>>();
  37. }
  38. /// <summary>
  39. /// 设置表单数据字段, 用于存放文本类型数据
  40. /// </summary>
  41. /// <param name="fieldName">指定的字段名称</param>
  42. /// <param name="fieldValue">指定的字段值</param>
  43. public void SetField(string fieldName, string fieldValue)
  44. {
  45. this._postDatas.Add(new KeyValuePair<string, string>(fieldName, fieldValue));
  46. }
  47. /// <summary>
  48. /// 以POST方式向目标地址提交表单数据
  49. /// </summary>
  50. /// <param name="url">目标地址, http(s)://sample.com</param>
  51. /// <returns>目标地址的响应</returns>
  52. public HttpWebResponse Post(string url)
  53. {
  54. if (string.IsNullOrWhiteSpace(url))
  55. throw new ArgumentNullException(nameof(url));
  56. HttpWebRequest request = null;
  57. if (url.ToLowerInvariant().StartsWith("https"))
  58. {
  59. request = WebRequest.Create(url) as HttpWebRequest;
  60. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
  61. request.ProtocolVersion = HttpVersion.Version11;
  62. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
  63. request.KeepAlive = true;
  64. ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
  65. ServicePointManager.Expect100Continue = false;
  66. }
  67. else
  68. {
  69. request = WebRequest.Create(url) as HttpWebRequest;
  70. }
  71. request.Method = "POST";
  72. request.ContentType = "application/x-www-form-urlencoded";
  73. request.UserAgent = this.UserAgent;
  74. request.Accept = this.Accept;
  75. request.Referer = this.Referer;
  76. request.CookieContainer = this.CookieContainer;
  77. var postData = string.Join("&", this._postDatas.Select(p => $"{p.Key}={p.Value}"));
  78. using(var requestStream = request.GetRequestStream())
  79. {
  80. var bytes = this.Encoding.GetBytes(postData);
  81. requestStream.Write(bytes, 0, bytes.Length);
  82. }
  83. return request.GetResponse() as HttpWebResponse;
  84. }
  85. /// <summary>
  86. /// 以POST方式向目标地址提交表单数据
  87. /// </summary>
  88. /// <param name="url">目标地址, http(s)://sample.com</param>
  89. /// <returns>目标地址的响应</returns>
  90. public async Task<HttpWebResponse> PostAsync(string url)
  91. {
  92. if (string.IsNullOrWhiteSpace(url))
  93. throw new ArgumentNullException(nameof(url));
  94. HttpWebRequest request = null;
  95. if (url.ToLowerInvariant().StartsWith("https"))
  96. {
  97. request = WebRequest.Create(url) as HttpWebRequest;
  98. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
  99. request.ProtocolVersion = HttpVersion.Version11;
  100. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
  101. request.KeepAlive = true;
  102. ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
  103. ServicePointManager.Expect100Continue = false;
  104. }
  105. else
  106. {
  107. request = WebRequest.Create(url) as HttpWebRequest;
  108. }
  109. request.Method = "POST";
  110. request.ContentType = "application/x-www-form-urlencoded";
  111. request.UserAgent = this.UserAgent;
  112. request.Accept = this.Accept;
  113. request.Referer = this.Referer;
  114. request.CookieContainer = this.CookieContainer;
  115. var postData = string.Join("&", this._postDatas.Select(p => $"{p.Key}={p.Value}"));
  116. using (var requestStream = await request.GetRequestStreamAsync())
  117. {
  118. var bytes = this.Encoding.GetBytes(postData);
  119. requestStream.Write(bytes, 0, bytes.Length);
  120. }
  121. return await request.GetResponseAsync() as HttpWebResponse;
  122. }
  123. }
  1. /// <summary>
  2. /// 用于以 POST 方式向目标地址提交表单数据, 仅适用于包含文件的请求
  3. /// </summary>
  4. public sealed class HttpPostFileRequestClient
  5. {
  6. #region - Private -
  7. private string _boundary;
  8. private List<byte[]> _postDatas;
  9. #endregion
  10. /// <summary>
  11. /// 获取或设置数据字符编码, 默认使用<see cref="System.Text.Encoding.UTF8"/>
  12. /// </summary>
  13. public Encoding Encoding { get; set; } = Encoding.UTF8;
  14. /// <summary>
  15. /// 获取或设置 UserAgent
  16. /// </summary>
  17. public string UserAgent { get; set; } = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
  18. /// <summary>
  19. /// 获取或设置 Accept
  20. /// </summary>
  21. public string Accept { get; set; } = "*/*";
  22. /// <summary>
  23. /// 获取或设置 Referer
  24. /// </summary>
  25. public string Referer { get; set; }
  26. /// <summary>
  27. /// 获取或设置 Cookie 容器
  28. /// </summary>
  29. public CookieContainer CookieContainer { get; set; } = new CookieContainer();
  30. /// <summary>
  31. /// 初始化一个用于以 POST 方式向目标地址提交表单数据的<see cref="HttpPostFileRequestClient"/>实例
  32. /// </summary>
  33. public HttpPostFileRequestClient()
  34. {
  35. this._boundary = DateTime.Now.Ticks.ToString("X");
  36. this._postDatas = new List<byte[]>();
  37. }
  38. /// <summary>
  39. /// 设置表单数据字段, 用于存放文本类型数据
  40. /// </summary>
  41. /// <param name="fieldName">指定的字段名称</param>
  42. /// <param name="fieldValue">指定的字段值</param>
  43. public void SetField(string fieldName, string fieldValue)
  44. {
  45. var field = $"--{this._boundary}\r\n" +
  46. $"Content-Disposition: form-data;name=\"{fieldName}\"\r\n\r\n" +
  47. $"{fieldValue}\r\n";
  48. this._postDatas.Add(this.Encoding.GetBytes(field));
  49. }
  50. /// <summary>
  51. /// 设置表单数据字段, 用于文件类型数据
  52. /// </summary>
  53. /// <param name="fieldName">字段名称</param>
  54. /// <param name="fileName">文件名</param>
  55. /// <param name="contentType">内容类型, 传入 null 将默认使用 application/octet-stream</param>
  56. /// <param name="fs">文件流</param>
  57. public void SetField(string fieldName, string fileName, string contentType, Stream fs)
  58. {
  59. var fileBytes = new byte[fs.Length];
  60. using (fs)
  61. {
  62. fs.Read(fileBytes, 0, fileBytes.Length);
  63. }
  64. SetField(fieldName, fileName, contentType, fileBytes);
  65. }
  66. /// <summary>
  67. /// 设置表单数据字段, 用于文件类型数据
  68. /// </summary>
  69. /// <param name="fieldName">字段名称</param>
  70. /// <param name="fileName">文件名</param>
  71. /// <param name="contentType">内容类型, 传入 null 将默认使用 application/octet-stream</param>
  72. /// <param name="fileBytes">文件字节数组</param>
  73. public void SetField(string fieldName, string fileName, string contentType, byte[] fileBytes)
  74. {
  75. var field = $"--{this._boundary}\r\n" +
  76. $"Content-Disposition: form-data; name=\"{fieldName}\";filename=\"{fileName}\"\r\n" +
  77. $"Content-Type:{contentType ?? "application/octet-stream"}\r\n\r\n";
  78. this._postDatas.Add(this.Encoding.GetBytes(field));
  79. this._postDatas.Add(fileBytes);
  80. this._postDatas.Add(this.Encoding.GetBytes("\r\n"));
  81. }
  82. /// <summary>
  83. /// 以POST方式向目标地址提交表单数据
  84. /// </summary>
  85. /// <param name="url">目标地址, http(s)://sample.com</param>
  86. /// <returns>目标地址的响应</returns>
  87. public HttpWebResponse Post(string url)
  88. {
  89. if (string.IsNullOrWhiteSpace(url))
  90. throw new ArgumentNullException(nameof(url));
  91. HttpWebRequest request = null;
  92. if (url.ToLowerInvariant().StartsWith("https"))
  93. {
  94. request = WebRequest.Create(url) as HttpWebRequest;
  95. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
  96. request.ProtocolVersion = HttpVersion.Version11;
  97. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
  98. request.KeepAlive = true;
  99. ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
  100. ServicePointManager.Expect100Continue = false;
  101. }
  102. else
  103. {
  104. request = WebRequest.Create(url) as HttpWebRequest;
  105. }
  106. request.Method = "POST";
  107. request.ContentType = "multipart/form-data;boundary=" + _boundary;
  108. request.UserAgent = this.UserAgent;
  109. request.Accept = this.Accept;
  110. request.Referer = this.Referer;
  111. request.CookieContainer = this.CookieContainer;
  112. var end = $"--{this._boundary}--\r\n";
  113. this._postDatas.Add(this.Encoding.GetBytes(end));
  114. var requestStream = request.GetRequestStream();
  115. foreach (var item in this._postDatas)
  116. {
  117. requestStream.Write(item, 0, item.Length);
  118. }
  119. return request.GetResponse() as HttpWebResponse;
  120. }
  121. /// <summary>
  122. /// 以POST方式向目标地址提交表单数据
  123. /// </summary>
  124. /// <param name="url">目标地址, http(s)://sample.com</param>
  125. /// <returns>目标地址的响应</returns>
  126. public async Task<HttpWebResponse> PostAsync(string url)
  127. {
  128. if (string.IsNullOrWhiteSpace(url))
  129. throw new ArgumentNullException(nameof(url));
  130. HttpWebRequest request = null;
  131. if (url.ToLowerInvariant().StartsWith("https"))
  132. {
  133. request = WebRequest.Create(url) as HttpWebRequest;
  134. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((s, c, ch, ss) => { return true; });
  135. request.ProtocolVersion = HttpVersion.Version11;
  136. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
  137. request.KeepAlive = true;
  138. ServicePointManager.CheckCertificateRevocationList = true; ServicePointManager.DefaultConnectionLimit = 100;
  139. ServicePointManager.Expect100Continue = false;
  140. }
  141. else
  142. {
  143. request = WebRequest.Create(url) as HttpWebRequest;
  144. }
  145. request.Method = "POST";
  146. request.ContentType = "multipart/form-data;boundary=" + _boundary;
  147. request.UserAgent = this.UserAgent;
  148. request.Accept = this.Accept;
  149. request.Referer = this.Referer;
  150. request.CookieContainer = this.CookieContainer;
  151. var end = $"--{this._boundary}--\r\n";
  152. this._postDatas.Add(this.Encoding.GetBytes(end));
  153. var requestStream = await request.GetRequestStreamAsync();
  154. foreach (var item in this._postDatas)
  155. {
  156. await requestStream.WriteAsync(item, 0, item.Length);
  157. }
  158. return await request.GetResponseAsync() as HttpWebResponse;
  159. }
  160. }

C# 模拟 HTTP POST请求的更多相关文章

  1. PHP模拟发送POST请求之五curl基本使用和多线程优化

    今天来介绍PHP模拟发送POST请求的重型武器——cURL函数库的使用和其多线程的优化方法. 说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不详,列出一大堆手册上的东西,搞得我入门时 ...

  2. PHP模拟发送POST请求之一、HTTP协议头部解析

    WEB开发中信息基本全是在POST与GET请求与响应中进行,GET因其基于URL的直观,易被我们了解,可POST请求因其信息的隐蔽,在安全的同时,也给开发者们模拟发送带来了麻烦.接下来的几篇博文中,我 ...

  3. Loadrunner模拟JSON接口请求进行测试

    Loadrunner模拟JSON接口请求进行测试     一.loadrunner脚本创建 1.Insert - New step -选择Custom Request -  web_custom_re ...

  4. WebClient模拟发送Post请求

    WebClient模拟发送Post请求方法: /// <summary> /// 模拟post请求 /// </summary> /// <param name=&quo ...

  5. httpClient模拟浏览器发请求

    一.介绍 httpClient是Apache公司的一个子项目, 用来提高高效的.最新的.功能丰富的支持http协议的客户端编程工具包.完成可以模拟浏览器发起请求行为. 二.简单使用例子 : 模拟浏览器 ...

  6. 【转载】curl 模拟 GET\POST 请求,curl查看响应头 以及 curl post 上传文件

    补充说明:curl查看响应头 curl -I "http://www.baidu.com"HTTP/1.1 200 OK #HTTP协议 HTTP 返回码Server: Tengi ...

  7. CountDownLatch和CyclicBarrier模拟同时并发请求

    有时候要测试一下某个功能的并发能力,又不要想借助于其他测试工具,索性就自己写简单的demo模拟一个并发请求就最方便了.如果熟悉jemter的测试某接口的并发能力其实更专业,此处只是自己折腾着玩. Co ...

  8. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  9. linux 模拟发http请求的例子

    curl -X POST --header "Content-Type: application/json" --header "Accept: */*" &q ...

  10. nodejs模拟http发送请求

    首先需要安装模块request,然后代码如下: //模拟发送http请求 var request = require("request"); //get请求 request('ht ...

随机推荐

  1. for里面是采用setInterval遍历二维数组,for循环到最后一个数的时候,才执行setInterval的问题解决

    点击播放看效果 <!doctype html> <html lang="en"> <head> <meta charset="U ...

  2. JavaScript 里 var a =a ||{}

    首先,搞明白||的意思. 1.在js里面,||运算符,比如(A||B)有个很有意思的用处: 2.系统先判断A表达式的布尔值,是真是假.如果为真,直接返回A.如果为假,直接返回B(不会判断B是什么类型) ...

  3. 使用paginate分页后数据处理

    public function index(){ $sql = ""; $list = ""; $pagenumber = 20;//默认分页条数 //查询数据 ...

  4. CJSON parse.c

    #include <stdio.h> #include <stdlib.h> #include "cJSON.h" void printJson(cJSON ...

  5. Docker容器中安装vim

    我在docker中安装了jexus.使用vim编辑default配置文件的时候提示 vim: command not found 原因是docker中没有安装vim命令 如果你直接输入  apt-ge ...

  6. 测试客户端连接12c ASM实例

    环境:Oracle 12.2.0.1 RAC 背景:用户反映12c ASM创建的用户具备sysasm权限,但无法在客户端连接到ASM实例,且没有报错. 1.ASM实例创建用户赋予sysasm权限 2. ...

  7. (3)打造简单OS-MBR引导区转移加载简单程序(突破512限制)

    在第一节<(1)汇编写入引导区,虚拟机启动步骤>中讲解到一个简单屏幕显示一川字符串,第二节讲到BIOS启动过程! 第一节中基本原理就是将那个汇编代码用nasm汇编器进行汇编成二进制,然后把 ...

  8. 解决Linux 环境 GLIBCXX_3.4.15' not found问题

    升级Centos系统之后,运行filezilla时,出现如下错误的提示信息: ./filezilla: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15 ...

  9. spring boot + vue + element-ui全栈开发入门——项目部署

     前言 常用的部署方式有两种: 1.是把生成好的静态页面放到spring boot的static目录下,与打包后的spring boot项目一起发布,当spring boot运行起来后,自然而然就能访 ...

  10. Delphi中PointerMath指令

    Type   Switch   Syntax   {$POINTERMATH ON} or {$POINTERMATH OFF}   Default   {$POINTERMATH OFF}   Sc ...