您的位置:首页 > 理论基础 > 计算机网络

HttpWebRequest模拟浏览器的GET、POST请求

2016-01-09 12:05 706 查看
在MVC学习系列继续之前,这里先插一篇——HttpWebRequest模拟浏览器的GET、POST请求。利用get 获取某一个电影,然后用POST修改。在这之前先将之前创建的MVC项目发布,如下图:



在模拟请求之前,我们先用Fiddler检测一下GET请求:



现在我们创建一个窗体应用程序,然后利用HttpWebRequest 按照上图中的HTTP头部信息模拟 GET请求,下面是代码:

private void LoadPre()
{
string url = "http://192.168.1.104/Movies/Edit/5";
HttpWebRequest request = null;
request = WebRequest.Create(url) as HttpWebRequest;
request.Accept = "text/html, application/xhtml+xml, image/jxr, */*";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586";
request.Method = "GET";
request.Host = "192.168.1.104";
request.KeepAlive = true;
request.Referer = "http://192.168.1.104/";
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", "zh-CN");
//如果没有 下面这行代码 将获取不到相应的Cookie (response.Cookies)
//其实 不添加这行代码对于获取 数据没有影响,但是过后的POST操作会用到相应的Cookie
request.CookieContainer = new CookieContainer();
//以下两行对于获取Cookie 对于本次测试 没有影响
//CookieCollection cc = new CookieCollection();
//request.CookieContainer.Add(cc);
try
{
//响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
int statusInt = response.StatusCode.GetHashCode();
//相应成功
if (response.StatusCode.ToString().ToLower() == "ok")
{
string strtUrl = response.ResponseUri.AbsoluteUri;
GV_CookieCollection = response.Cookies;
string responseText = null;
if (response.ContentEncoding.ToLower() == "gzip")
{
responseText = HttpUtility.HtmlDecode(new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8).ReadToEnd());
}
else if (response.CharacterSet.ToLower() == "utf-8")
{
responseText = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
}
else
{
responseText = new StreamReader(response.GetResponseStream(), Encoding.Default).ReadToEnd();
}
if (!string.IsNullOrEmpty(responseText))
{
webBrowser1.DocumentText = responseText;
//以下通过 正则表达式 查到隐藏域 name='__RequestVerificationToken'
//为稍后的POST请求使用
string patternRegion = "<\\s*input\\s*.*name\\s*=\\s*\"__RequestVerificationToken\"\\s*.*value\\s*=\\s*\"(?<value>[\\w-]{108,108})\"\\s*/>";
RegexOptions regexOptions = RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled;
Regex reg = new Regex(patternRegion, regexOptions);
MatchCollection mc = reg.Matches(responseText);
foreach (Match m in mc)
{
hidRequestVerificationToken = m.Groups["value"].Value;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
下面看一下程序截图:



很容易发现,获取的页面和点击页面中“编辑”获取的页面一样。哈哈,因为我们就是模拟他吗?

下面我们看一下Fiddler检测修改时的截图:





下面我们就模拟上面的POST请求,上代码:

private void btnModify_Click(object sender, EventArgs e)
{
string url = "http://192.168.1.104/Movies/Edit/5";
HttpWebRequest request = null;
request = WebRequest.Create(url) as HttpWebRequest;
request.Accept = "text/html, application/xhtml+xml, image/jxr, *";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586";
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Host = "192.168.1.104";
request.KeepAlive = true;
request.Headers.Add("Pragma", "no-cache");
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", "zh-CN");
//没有下面两行代码  请求得不到相应  会出现错误提示:远程服务器返回错误: (500) 内部服务器错误。
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(GV_CookieCollection);
StringBuilder sb = new StringBuilder();
//__RequestVerificationToken  参数中没有它也是不行的,你可以试试
sb.Append("__RequestVerificationToken=");
sb.Append(hidRequestVerificationToken);
sb.Append("&ID=5");
sb.Append("&Title=速度与激情4");
sb.Append("&ReleaseDate=2009-04-03");
sb.Append("&Genre=动作");
sb.Append("&Price=45.5");
byte[] b = new UTF8Encoding().GetBytes(sb.ToString());
request.ContentLength = b.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(b, 0, b.Length);
}
try
{
//响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
int statusInt = response.StatusCode.GetHashCode();
//相应成功
if (response.StatusCode.ToString() == "OK")
{
string responseUri = response.ResponseUri.AbsoluteUri;
MessageBox.Show("修改成功!");
LoadPre();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
下面看一下运行情况:



点击上图中的【确定】按钮如下图:



接下来我们在刷新一下列表页面,如下图:



看一下代码结构,如下图:



每次还得留意Cookie,挺麻烦的,不知道有没有好方法!听说HttpClient不错。哈哈!这篇就写到这里了!谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: