关于HttpWebRequest Post数据学习
2014-05-13 14:46
239 查看
由于工作需要看了下别人写的代码,嗯,这个功能确实不错,就是使用一个软件自动提交服务器信息,然后自动处理一些操作,当然这些都是预先定义好了的,就像当年的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 cookie
4000
s, 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();
试一试能不能得到我们想要的效果呢。
下面来说说关于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 cookie
4000
s, 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提交及后台获取数据
- 20110215 学习记录2:表单中的get和post区别 & 使用 HttpWebRequest 向网站提交数据
- 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用web_custom_request()提交json数据
- HttpWebRequest 向网站提交数据 (post与get方式)
- HttpWebRequest发送数据 post
- 利用HttpWebRequest以POST方式提交Json数据-后台实现不同平台间的数据传输
- 使用HttpWebRequest post数据时要注意UrlEncode
- POST数据提交,关于System.Web.HttpUtility.HtmlEncode与System.Web.HttpUtility.UrlEncode的区别
- C#中使用HttpWebRequest用Post提交MultiPart数据
- C# winform端 通过HttpWebRequest进行post和get请求,数据格式为json,后台java端接收,其中有关传输特殊字符(\t,\r,',\n,n)等处理
- HttpWebRequest Post 方式发送 XML数据
- C# httpwebrequest post 发送的数据 urlencode 问题
- C# HttpWebRequest Post Get 请求数据
- C#利用HttpWebRequest,Stream,HttpWebResponse,StreamReader获取post返回的数据
- 使用HttpWebRequest用Post提交MultiPart数据
- HttpWebRequest开发向asp.net服务端post数据,对ViewState的处理
- webrequest post 数据 编码 HttpWebRequest get
- 黄聪:C#模拟网站页面POST数据提交表单(二)--HttpWebRequest以及HttpWebResponse (转)
- C#中使用HttpWebRequest用Post提交MultiPart数据
- 使用HttpWebRequest POST数据到服务器上