关于HttpWebRequest Post数据学习

来源:互联网 发布:青天白日勋章淘宝购买 编辑:程序博客网 时间:2024/05/23 00:11

由于工作需要看了下别人写的代码,嗯,这个功能确实不错,就是使用一个软件自动提交服务器信息,然后自动处理一些操作,当然这些都是预先定义好了的,就像当年的QQ农场外挂一样,说实话我还是很喜欢写外挂的,其实应该叫辅助软件。当然这些操作的提交方式和提交指向你都要预先得到,对于自己写的当然就不用了。如何得到操作的提交路径,和读取路径呢?可以下载Httpwatch来,监控一下,你在某些网站上面的操作的一些提交地址等等。

下面来说说关于http协议,这里说的是http哈不是https,这是不同的概念,由于http协议时一种无状态的协议。即,信息提交完毕,和服务器的通讯就结束了,他们说不是有Session的嘛,是啊,那个是放在服务器的嘛,客户端仅仅是一些cookies罢了,然后每次提交都把服务器返回的cookies带上,然后重新进入新的提交,服务器即IIS等,会自动把cookies转换成所谓的session的,应该是这样吧,至少这不是我们的关注点。
下面进入主题了。如何进行自动提交获取信息。这里我们需要先建立一个Web项目来供我们测试,因为手里面没有测试的方案,就自动东手写了,因为这个不是所有的网站都可以实现,这个没试过。

1。第一步我们建立一个小型的测试网站。
建立web页面。Login.aspx,Next.aspx,NextC.aspx
Login.aspx。后台没有代码。
<form id="form1" action="Next.aspx" method="post">
    用户:<input id="name" name="name" type="text" /><br />
    密码:<input id="pwd" name="pwd" type="password" /><br />
    <input id="Submit1" type="submit" value="submit" />
    </form>
Next.aspx。后台Request.Form处理登陆信息,判断是否正确,给全局变量content赋值。这里仅仅举例
前台:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NextC.aspx.cs" Inherits="webapp.NextC" EnableViewState="false" %>
<%=content %>
后台:
定义全局的
Protected string content=string.Empty;
写在Load事件里面。
if (!string.IsNullOrEmpty(Request.Form["name"]) && !string.IsNullOrEmpty(Request.Form["pwd"]))
            {
                if (Request.Form["name"].ToString() != "admin" || Request.Form["pwd"].ToString() != "123456")
                {
                    this.content = "用户名密码错误";
                }
                else
                {
                    this.content = "登陆成功";
                    Session["User"] = "admin";
                }
            }
            else
            {
                this.content = "未登录";
            }
NextC.aspx。这个页面就对登陆成功的用户进行返回信息了,就好像我们登陆成功获取自己的信息一样。
前台。前台页面跟Next.aspx一样。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NextC.aspx.cs" Inherits="webapp.NextC" EnableViewState="false" %>
<%=content %>
后台:
protected string content = string.Empty;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(Session["User"]))
            {
                this.content = "未登录";
            }
            else
            {
                string name= Session["User"].ToString();
                this.content = name;
            }
        }
....这样关于测试网站我们就建立好了。
2.建立一个测试的项目,我们选择控制台应用程序。
分析:首先,我们对Next.aspx进行post提交我们已经写好的数据,然后get提交NextC.aspx看看返回的是不是我们需要的信息就完毕了。
好了,由于提交了两次我们想想,看能不能独立一个方法出来。于是有了下面的代码。
public static Stream getStream(string url, string method, ref string cookies, params string[] param)
        {
            Stream stream = null;
            string data= string.Empty;

            if (param != null && param.Length != 0)
            {
                data= string.Join("&", param);
            }
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = method.ToUpper();

            bool isPost = request.Method.ToUpper() == "POST";
            if (isPost)
            {
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = bytes.Length;
            }
            request.Headers.Add("cookie", cookies);
            request.Headers.Add("Cache-Control", "no-cache");

            if (isPost)
            {
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string outCookie = response.Headers.Get("Set-Cookie");
            cookies = GetCookies(cookies, outCookie); // 这里的这个操作时把新的cookies填充到旧的里面,
// 这里我们采用了一个方法,即,把新的,保持新的cookies不变,读取旧的,如果新的里面不存在,就插入到新的里面,如果存在就不考虑了,我们就还是使用新的。因为cookie字符串是以:name=admin;pwd=xxxxx这样的形式存在的,所以也很好拆分字符串的。使用到了string.Join,等函数,这个就不一一讲解了。有什么问题,可以留言。我会解答的。

            Stream stream = response.GetResponseStream();

            return stream;
        }

// 最后我们调用了。
然后Main函数里面直接调用,就可以了。
下面是测试代码:
string cookies = string.Empty;

            string[] logininfo = new string[2] { "name=tanghao", "pwd=123456" };

            // 执行登陆
            Stream loginStream = getStream("http://localhost:1282/Next.aspx", "post", 30000, false, ref cookies, logininfo);

            Console.WriteLine(new StreamReader(loginStream).ReadToEnd());
            Console.ReadLine();
            Console.WriteLine("=======================================================================");

            // 执行界面查询
            Stream searchStream = getStream("http://localhost:1282/NextC.aspx", "get", 30000, false, ref cookies, null);
            Console.WriteLine(new StreamReader(searchStream).ReadToEnd());

            Console.ReadLine();

            loginStream.Close();
            searchStream.Close();

试一试能不能得到我们想要的效果呢。
关于HttpWebRequest Post数据学习 - 棋圣就是我 - mort_1990 的博客

0 0
原创粉丝点击