HttpWebRequest模拟浏览器的GET、POST请求 - Go语言中文社区

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


在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不错。哈哈!这篇就写到这里了!谢谢!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/duyelang/article/details/50487146
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 10:11:30
  • 阅读 ( 1976 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢