我需要在程序上模拟一个HTTP POST,也就是说,我需要用一些POST变量生成一个Request,然后将它发送到一个页面.
要澄清一点,我需要模拟一个常规POST的行为,而不是以整体的方式进行编程.所以基本上我需要填写一个请求,就像Post POST表单一样,填写一个Request,然后将浏览器发送到期望POST的页面.
解决方法
这是一种方法.
您可以以NameValueCollection的形式发送此方法的url和name / value参数.该方法在端点上创建一个Http Post,并将其作为字符串返回.
当然,这取决于什么/为什么你这样做,这个方法将被称为多少次,还有其他的选择.但是,直到您提供有关您的具体需求的更多信息,这种方法是足够好的.
下面的方法使用Tasks(.NET 4.0)和异步方法,所以如果你在一个循环中进行多个调用,它将比下一个代码列表中的同步方法更快.
static string GetWebResponse(string url,NameValueCollection parameters) { var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.Method = "POST"; var sb = new StringBuilder(); foreach (var key in parameters.AllKeys) sb.Append(key + "=" + parameters[key] + "&"); sb.Length = sb.Length - 1; byte[] requestBytes = Encoding.UTF8.GetBytes(sb.ToString()); httpWebRequest.ContentLength = requestBytes.Length; using (var requestStream = httpWebRequest.GetRequestStream()) { requestStream.Write(requestBytes,requestBytes.Length); requestStream.Close(); } Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse,httpWebRequest.EndGetResponse,null); using (var responseStream = responseTask.Result.GetResponseStream()) { var reader = new StreamReader(responseStream); return reader.ReadToEnd(); } }
你也可以使用WebClient(它比较简单).此方法期望post参数作为表单中的字符串
name1=value1&name2=value2&name3=value3
所以如果你使用这个方法一定要传递你的参数,或者修改实现就像上面的代码.
static string HttpPost(string url,string Parameters) { var req = System.Net.WebRequest.Create(url); req.ContentType = "application/x-www-form-urlencoded"; req.Method = "POST"; byte[] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters); req.ContentLength = bytes.Length; System.IO.Stream os = req.GetRequestStream (); os.Write (bytes,bytes.Length); os.Close (); System.Net.WebResponse resp = req.GetResponse(); if (resp== null) return null; var sr = new StreamReader(resp.GetResponseStream()); return sr.ReadToEnd().Trim(); }