HttpWebRequest模拟浏览器的GET、POST请求
2016-01-09 12:05
706 查看
在MVC学习系列继续之前,这里先插一篇——HttpWebRequest模拟浏览器的GET、POST请求。利用get 获取某一个电影,然后用POST修改。在这之前先将之前创建的MVC项目发布,如下图:
在模拟请求之前,我们先用Fiddler检测一下GET请求:
现在我们创建一个窗体应用程序,然后利用HttpWebRequest 按照上图中的HTTP头部信息模拟 GET请求,下面是代码:
很容易发现,获取的页面和点击页面中“编辑”获取的页面一样。哈哈,因为我们就是模拟他吗?
下面我们看一下Fiddler检测修改时的截图:
下面我们就模拟上面的POST请求,上代码:
点击上图中的【确定】按钮如下图:
接下来我们在刷新一下列表页面,如下图:
看一下代码结构,如下图:
每次还得留意Cookie,挺麻烦的,不知道有没有好方法!听说HttpClient不错。哈哈!这篇就写到这里了!谢谢!
在模拟请求之前,我们先用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不错。哈哈!这篇就写到这里了!谢谢!
相关文章推荐
- 【转】HTTP Live Streaming直播(iOS直播)技术分析与实现
- 正则基础之 \b 单词边界(http://www.jb51.net/article/19330.htm)
- tomcat http get 参数中文乱码,tomcat源码解析
- 如何在cisco/h3c/华为的网络设备中一次性打印全部配置信息(show run和display current-configuration)
- tcpdump的简单应用
- http请求诡异问题
- Android网络请求心路历程
- Android Volley框架的使用之图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- 深度学习卷积网络的资源
- http协议(转)
- HTTP Status 500 - Request processing failed; nested exception is org.springframework.jdbc.BadSqlGram
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- 全站HTTPS来了
- 每秒千万网络包的线速 SYN/DNS flooding
- 基于Python SimpleHTTPServer.py的修改脚本:HTTP文件服务器,修正中文目录列表,支持视频文件在线播放
- python学习第十课 多路复用、ThreadingTCPServer、线程与进程
- 解决Xcode7 iOS9苹果将原http协议改成了https协议问题
- ASIHTTPRequest 提示#import <libxml/HTMLparser.h>找不到
- 荣狐网络商业融资计划书(概要)
- 【异常】OS X 10.11( EI )上 Nginx 的 https moudle