利用HttpWebRequest模拟表单提交

Posted allyn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用HttpWebRequest模拟表单提交相关的知识,希望对你有一定的参考价值。

  1 using System;
  2 using System.Collections.Specialized;
  3 using System.IO;
  4 using System.Net;
  5 using System.Text;
  6 
  7 namespace Allyn.Common
  8 {
  9     public class HttpHelper
 10     {
 11         /// <summary>
 12         /// 获取指定路径数据
 13         /// </summary>
 14         /// <param name="requestUri">提交路径</param>
 15         /// <param name="cookie">Cookie容器对象</param>
 16         /// <returns>字符串结果</returns>
 17         public static string GetForm(string requestUri, CookieContainer cookie)
 18         {
 19             HttpWebRequest request = WebRequest.CreateHttp(requestUri);
 20             request.Method = "get";
 21             request.CookieContainer = cookie;
 22             request.ContentLength = 0;
 23 
 24             WebResponse response = request.GetResponse();
 25             StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
 26             return reader.ReadToEnd();
 27         }
 28 
 29         /// <summary>
 30         /// 默认表单提交
 31         /// </summary>
 32         /// <param name="requestUri">提交路径</param>
 33         /// <param name="postData">提交数据</param>
 34         /// <param name="cookie">Cookie容器对象</param>
 35         /// <returns>字符串结果</returns>
 36         public static string PostForm(string requestUri, NameValueCollection postData, CookieContainer cookie)
 37         {
 38             HttpWebRequest request = WebRequest.CreateHttp(requestUri);
 39             request.Method = "post";
 40             request.ContentType = "application/x-www-form-urlencoded";
 41             request.CookieContainer = cookie;
 42 
 43             StringBuilder stringBuilder = new StringBuilder();
 44             foreach (string key in postData.Keys)
 45             {
 46                 stringBuilder.AppendFormat("&{0}={1}", key, postData.Get(key));
 47             }
 48             byte[] buffer = Encoding.UTF8.GetBytes(stringBuilder.ToString().Trim(&));
 49             Stream requestStream = request.GetRequestStream();
 50             requestStream.Write(buffer, 0, buffer.Length);
 51             requestStream.Close();
 52 
 53             WebResponse response = request.GetResponse();
 54             StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
 55             return reader.ReadToEnd();
 56         }
 57 
 58         /// <summary>
 59         /// 多部件表单提交
 60         /// </summary>
 61         /// <param name="requestUri">提交路径</param>
 62         /// <param name="postData">提交数据.注:如果是文件路径,代表是文件.</param>
 63         /// <param name="cookie">Cookie容器对象</param>
 64         /// <returns>字符串结果</returns>
 65         public static string PostFormMultipart(string requestUri, NameValueCollection postData, CookieContainer cookie)
 66         {
 67             string boundary = string.Format("-----{0}", DateTime.Now.Ticks.ToString("x"));
 68             HttpWebRequest webrequest = WebRequest.CreateHttp(requestUri);
 69             webrequest.CookieContainer = cookie;
 70             webrequest.Timeout = 120000;
 71             webrequest.Method = "post";
 72             webrequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
 73 
 74             Stream requestStream = webrequest.GetRequestStream();
 75             foreach (string key in postData.Keys)
 76             {
 77                 StringBuilder strBuilder = new StringBuilder();
 78                 strBuilder.AppendFormat("--{0}", boundary);
 79                 strBuilder.AppendFormat("
Content-Disposition: form-data; name="{0}"", key);
 80                 if (File.Exists(postData.Get(key)))
 81                 {
 82                     strBuilder.AppendFormat(";filename="{0}"
Content-Type: multipart/form-data

", Path.GetFileName(postData.Get(key)));
 83                     byte[] buffer = Encoding.UTF8.GetBytes(strBuilder.ToString());
 84                     requestStream.Write(buffer, 0, buffer.Length);
 85                     //获取图片流
 86                     FileStream fileStream = new FileStream(postData.Get(key), FileMode.Open, FileAccess.Read);
 87                     BinaryReader binaryReader = new BinaryReader(fileStream);
 88                     byte[] fileBuffer = binaryReader.ReadBytes((int)fileStream.Length);
 89                     binaryReader.Close();
 90                     fileStream.Close();
 91                     requestStream.Write(fileBuffer, 0, fileBuffer.Length);
 92                 }
 93                 else
 94                 {
 95                     strBuilder.AppendFormat("

{0}
", postData.Get(key));
 96                     byte[] buff = Encoding.UTF8.GetBytes(strBuilder.ToString());
 97                     requestStream.Write(buff, 0, buff.Length);
 98                 }
 99             }
100 
101             byte[] boundaryBuffer = Encoding.UTF8.GetBytes(string.Format("
--{0}
", boundary));
102             requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
103             requestStream.Close();
104 
105             WebResponse response = webrequest.GetResponse();
106             StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
107             return reader.ReadToEnd();
108         }
109     }
110 }

 

以上是关于利用HttpWebRequest模拟表单提交的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebRequest 表单提交

c# httpwebrequest 模拟登陆

C#,HttpWebRequest模拟发送Post请求

利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)

为啥使用了form表单之后页面会跳转,并且页面一片空白

利用cookie进行模拟登录并且抓取失败