关于HttpWebRequest提交表单 收录以备用
2011-05-18 14:10
295 查看
本想做个提取某页一些数据的小程序.以前也看过些爬虫方面的知识.可这次这个网页的内容需要登录后才能提取.这下把我有点难住了.
问题:
1. 是否我在浏览器登录后在程序中访问就等于登录了呢?
于是经过测试, 失败告终!
猜想原因:可能COOKIE只与特定浏览器关联,由于我是在Console中通过代码访问页面,所以不能关联到浏览器的COOKIE
于是上网查了些关于HttpWebRequest提交表单的内容,经过很多次测试终于成功!(可能自己网络方面的基础不是太好,所以才这么费劲)
下面就介绍下http方面的一些知识吧.(由自己测试整理)
一个人通过浏览器输入网址访问一个网站其实是向网站服务器发送了一个http请求.内容如下:
GET /my.html HTTP/1.1
Host: www.myweb.com
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE.6.0; Windows NT 5.1)
Pragma: no-cache
Cache-Control: no-cache
Connection: close
[空行]
此请求说明 通过GET方式请求服务器上的页面my.html,协议版本是1.1,黑体部分被成为http头部
当Web服务器接收到该请求时,服务器检查所请求的资源是否有效,且是否有相应的权限。如果没有问题,则服务器会传回类似如下的http响应信息:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thursday, March 31, 2005 17:15:23 GMT
Content-Type: text/html
Content-Length: 88
[空行]
<html>
<head>
<title>my.html</title>
</head>
<body>
</body>
</html>
下面说下GET方式和POST方式的区别:
通过GET方式提交表单会把表单中的内容都附加到url后面,如下
get1.html?text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD(button为提交按钮名)
其中不但包括各种input型元素的内容还包括提交按钮的值!
而POST方式是先发送一个http请求,而后再发送一个参数数据包(通过sniffer查看)
POST /form.html HTTP/1.1Content-Type: application/x-www-form-urlencoded
Content-Length: 6
[空行]
text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD请注意是通过两次发送的!
而在asp.net页面中还要附加_VIEWSTATE和_EVENTVALIDATION,否则请求会失败.
总而言之:GET方式发送一个请求同时把参数传过去.
POST方式是通过两次请求发送,一次发送http请求,一次发送参数(注意发送数据时要转换为字节类型)
下面是代码:(通过GET方式,POST方式如述原理代码略)
测试网站共有两个页
1. Login.aspx 登录后建立COOKIE
2. Default.aspx 测试是否建立COOKIE
原理:通过程序模拟登录,然后访问Default.aspx测试是否登录成功!
注意点:
1. 通过post发送的数据要转换为字节类型
2. 参数要转换为url编码(只需转换自己添加的参数,表单自己添加的参数不用转换)
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace GetTop10
{
class Program
{
static void Main(string[] args)
{
//关联COOKIE
CookieContainer cookieContainer = new CookieContainer();
//先请求 Login.aspx页并且提交POST数据,模拟登录
HttpWebRequest login = (HttpWebRequest)WebRequest.Create("http://localhost/Login.aspx");
login.Method = "POST";
login.KeepAlive = false;
//接收返回的页面
HttpWebResponse responseLogin = login.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = responseLogin.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
string srcString = reader.ReadToEnd();
// 获取页面的 VeiwState
string viewStateFlag = "id=/"__VIEWSTATE/" value=/"";
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
int j = srcString.IndexOf("/"", i);
string viewState = srcString.Substring(i, j - i);
// 获取页面的 EventValidation
string eventValidationFlag = "id=/"__EVENTVALIDATION/" value=/"";
i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
j = srcString.IndexOf("/"", i);
string eventValidation = srcString.Substring(i, j - i);
//转换为URL编码
viewState = System.Uri.EscapeDataString(viewState);
eventValidation = System.Uri.EscapeDataString(eventValidation);
string formatString =
"TextBox1={0}&TextBox2={1}&Button1={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
string postString =
string.Format(formatString, "song", "song", "登录", viewState, eventValidation);
// 发送的数据必须转换为字节类型
byte[] postData = Encoding.ASCII.GetBytes(postString);
// 通过GET方式登录
login = WebRequest.Create("http://127.0.0.1/Login.aspx?"+postString) as HttpWebRequest;
login.Method = "GET";
login.KeepAlive = false;
login.ContentType = "application/x-www-form-urlencoded";
login.CookieContainer = cookieContainer; //关联建立的COOKIE
// 接收返回的页面
responseLogin = login.GetResponse() as HttpWebResponse;
responseStream = responseLogin.GetResponseStream();
reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
srcString = reader.ReadToEnd();
// 访问Default.aspx页面测试是否登录成功!
string URI = "http://127.0.0.1/Default.aspx";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URI);
req.Method = "GET";
req.KeepAlive = false;
req.CookieContainer = cookieContainer;
// 接收返回的页面
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
Stream rs = res.GetResponseStream();
reader = new System.IO.StreamReader(rs, Encoding.UTF8);
srcString = reader.ReadToEnd();
Console.WriteLine(cookieContainer.Count);
Console.WriteLine(srcString);
Console.ReadLine();
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/an3gsonnzhy/archive/2008/10/30/3183722.aspx
问题:
1. 是否我在浏览器登录后在程序中访问就等于登录了呢?
于是经过测试, 失败告终!
猜想原因:可能COOKIE只与特定浏览器关联,由于我是在Console中通过代码访问页面,所以不能关联到浏览器的COOKIE
于是上网查了些关于HttpWebRequest提交表单的内容,经过很多次测试终于成功!(可能自己网络方面的基础不是太好,所以才这么费劲)
下面就介绍下http方面的一些知识吧.(由自己测试整理)
一个人通过浏览器输入网址访问一个网站其实是向网站服务器发送了一个http请求.内容如下:
GET /my.html HTTP/1.1
Host: www.myweb.com
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE.6.0; Windows NT 5.1)
Pragma: no-cache
Cache-Control: no-cache
Connection: close
[空行]
此请求说明 通过GET方式请求服务器上的页面my.html,协议版本是1.1,黑体部分被成为http头部
当Web服务器接收到该请求时,服务器检查所请求的资源是否有效,且是否有相应的权限。如果没有问题,则服务器会传回类似如下的http响应信息:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thursday, March 31, 2005 17:15:23 GMT
Content-Type: text/html
Content-Length: 88
[空行]
<html>
<head>
<title>my.html</title>
</head>
<body>
</body>
</html>
下面说下GET方式和POST方式的区别:
通过GET方式提交表单会把表单中的内容都附加到url后面,如下
get1.html?text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD(button为提交按钮名)
其中不但包括各种input型元素的内容还包括提交按钮的值!
而POST方式是先发送一个http请求,而后再发送一个参数数据包(通过sniffer查看)
POST /form.html HTTP/1.1Content-Type: application/x-www-form-urlencoded
Content-Length: 6
[空行]
text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD请注意是通过两次发送的!
而在asp.net页面中还要附加_VIEWSTATE和_EVENTVALIDATION,否则请求会失败.
总而言之:GET方式发送一个请求同时把参数传过去.
POST方式是通过两次请求发送,一次发送http请求,一次发送参数(注意发送数据时要转换为字节类型)
下面是代码:(通过GET方式,POST方式如述原理代码略)
测试网站共有两个页
1. Login.aspx 登录后建立COOKIE
2. Default.aspx 测试是否建立COOKIE
原理:通过程序模拟登录,然后访问Default.aspx测试是否登录成功!
注意点:
1. 通过post发送的数据要转换为字节类型
2. 参数要转换为url编码(只需转换自己添加的参数,表单自己添加的参数不用转换)
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace GetTop10
{
class Program
{
static void Main(string[] args)
{
//关联COOKIE
CookieContainer cookieContainer = new CookieContainer();
//先请求 Login.aspx页并且提交POST数据,模拟登录
HttpWebRequest login = (HttpWebRequest)WebRequest.Create("http://localhost/Login.aspx");
login.Method = "POST";
login.KeepAlive = false;
//接收返回的页面
HttpWebResponse responseLogin = login.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = responseLogin.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
string srcString = reader.ReadToEnd();
// 获取页面的 VeiwState
string viewStateFlag = "id=/"__VIEWSTATE/" value=/"";
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
int j = srcString.IndexOf("/"", i);
string viewState = srcString.Substring(i, j - i);
// 获取页面的 EventValidation
string eventValidationFlag = "id=/"__EVENTVALIDATION/" value=/"";
i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
j = srcString.IndexOf("/"", i);
string eventValidation = srcString.Substring(i, j - i);
//转换为URL编码
viewState = System.Uri.EscapeDataString(viewState);
eventValidation = System.Uri.EscapeDataString(eventValidation);
string formatString =
"TextBox1={0}&TextBox2={1}&Button1={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
string postString =
string.Format(formatString, "song", "song", "登录", viewState, eventValidation);
// 发送的数据必须转换为字节类型
byte[] postData = Encoding.ASCII.GetBytes(postString);
// 通过GET方式登录
login = WebRequest.Create("http://127.0.0.1/Login.aspx?"+postString) as HttpWebRequest;
login.Method = "GET";
login.KeepAlive = false;
login.ContentType = "application/x-www-form-urlencoded";
login.CookieContainer = cookieContainer; //关联建立的COOKIE
// 接收返回的页面
responseLogin = login.GetResponse() as HttpWebResponse;
responseStream = responseLogin.GetResponseStream();
reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
srcString = reader.ReadToEnd();
// 访问Default.aspx页面测试是否登录成功!
string URI = "http://127.0.0.1/Default.aspx";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URI);
req.Method = "GET";
req.KeepAlive = false;
req.CookieContainer = cookieContainer;
// 接收返回的页面
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
Stream rs = res.GetResponseStream();
reader = new System.IO.StreamReader(rs, Encoding.UTF8);
srcString = reader.ReadToEnd();
Console.WriteLine(cookieContainer.Count);
Console.WriteLine(srcString);
Console.ReadLine();
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/an3gsonnzhy/archive/2008/10/30/3183722.aspx
相关文章推荐
- 关于C#提交表单post和get的实现 HttpWebRequest 和ttpebeponse
- 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- 20110215 学习记录2:表单中的get和post区别 & 使用 HttpWebRequest 向网站提交数据
- C#的提交表单方式主要有两种WebClient与HttpWebRequest
- C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse
- C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- .NET HttpWebRequest POST 提交表单(烦人啊)
- 黄聪:C#模拟网站页面POST数据提交表单(二)--HttpWebRequest以及HttpWebResponse (转)
- 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- 使用HttpWebRequest提交表单数据
- 关于HttpWebRequest的Post提交及后台获取数据
- HttpWebRequest 表单提交
- HttpWebRequest GET方式提交Asp.net表单.doc COOKIE
- 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- C#模拟POST提交表单--HttpWebRequest以及HttpWebResponse
- C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse
- HttpWebRequest GET方式提交Asp.net表单.doc COOKIE
- 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用web_custom_request()提交json数据
- 黄聪:C#模拟网站页面POST数据提交表单(二)--HttpWebRequest以及HttpWebResponse (转)
- 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用web_custom_request()提交json数据