社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
在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不错。哈哈!这篇就写到这里了!谢谢!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!