由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件。在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助。因为技术有限,可能有些内容并不完全正确或者理解有偏差,希望大家不要见怪,有不同的想法可以留言,我们共同学习,这也是我开始写博客的初衷之一。
模拟请求,首先我觉得我们需要明确的是,模拟那些请求,我们模拟请求要完成那些操作,就拿我上面的功能来说,我需要模拟登录某个网站,然后打开固定的页面,输入关键字,查找相关信息,然后上传所需要的文件。那么这一系列就是需要我模拟完成的请求。为什么这么说呢,因为做过模拟登录的人可能知道,打开一个网站,他会有很多的请求,你不可能逐一的完成所有的请求,我们只需要模拟完成我们需要的几个请求就可以了。搞清楚我们需要模拟那些请求,接下来我们就可以开发了。
因为工作的特殊性,无法将我开发的项目拿出来讲解,所以我就将具体问题跟大家分享一下。
一、请求头的的设置:
对于一个特定的网站,一般而言,请求头大致是相同的,因此我们可以设置一个统一的请求头,这么做的好处详细大家能够想的到。定义好这个请求头后,在以后的请求中可以直接把collection当做参数传递下去就可以了。
NameValueCollection collection = new NameValueCollection(); collection.Add("Accept","text/html, application/xhtml+xml, */*"); collection.Add("Accept-Encoding","gzip, deflate"); collection.Add("Accept-Language","zh-CN"); collection.Add("UserAgent","Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
二、HttpWebRequest和HttpWebResponse的创建,以及模拟请求:在此我把我项目中完成用户登录的模拟请求代码贴出来供大家参考
HttpWebRequest requestLoginToPage = (HttpWebRequest)WebRequest.Create(Url);//创建HttpWebRequest对象
requestLoginToPage.Headers.Add(collection);//添加定义好的请求头
requestLoginToPage.Referer = Url;//重定向地址
requestLoginToPage.ContentType = "application/x-www-form-urlencoded";
requestLoginToPage.Host = IP;
requestLoginToPage.Headers.Add("Pragma", "no-cache");
requestLoginToPage.Headers.Add("DNT","1");
requestLoginToPage.KeepAlive = true;//保持连接
requestLoginToPage.CookieContainer =cookieContainer;//设置Cookie的值
requestLoginToPage.Method = "POST";//请求方法,有POST和GET两种
requestLoginToPage.AllowAutoRedirect = false;//禁止页面重定向,在这里禁止重定向是因为要取当前请求响应头中的值,所以才禁止重定向
//login
//账户 密码
if (username == null) { username = ""; }
if (psw == null) { psw = ""; }
string data = "";
//请求参数,每个网站传递参数的形式不一样,具体情况要分析抓取结果,有的可能会进行特殊的编码处理,有的会在后边加时间戳,我使用Fiddle4抓包的,使用方法后期博文中会贴出
data = "username=" + username + "&password=" + psw + "&scope=<=" + lt + "&_eventId=submit";
if (data != null)//if之内的是对于需要传递参数特定的形式,我也不太清楚为什么要这么写,有知道的可以告诉我
{
byte[] bytes = Encoding.ASCII.GetBytes(data);
requestLoginToPage.ContentLength = bytes.Length;
Stream streamLoginToPage = requestLoginToPage.GetRequestStream();
streamLoginToPage.Write(bytes, 0, bytes.Length);
streamLoginToPage.Flush();
streamLoginToPage.Close();
}
//响应请求
HttpWebResponse responseLoginToPage = (HttpWebResponse)requestLoginToPage.GetResponse();
//这是得到响应请求中的Location的值,前边禁止重定向就是为了得到它。
string Locathion = responseLoginToPage.Headers["Location"].ToString();