一个关于Indy 9.0的 TIdHTTP 控件使用的问题,post方法无法提交数据。各位老大帮忙看看。(200分)

  • 主题发起人 主题发起人 janthan
  • 开始时间 开始时间
J

janthan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在delphi7下使用TIdHTTP控件登陆一个网站,该网站是使用ASP.net建立的,需要提供用户名、密码、登录保留时间等信息,但使用post方法无法正常登录,会是什么问题?
大家可以使用www.1disk.cn验证一下。

代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
mytemp:TStringStream;
ss:TStringStream;
url:OleVariant;

begin
mytemp := TStringStream.Create('username=111&password=222&save=0');
//下面两个是该登录页面的隐藏属性
mytemp.WriteString('&__VIEWSTATE=/wEPDwUKMTcyOTg0OTI5MQ9kFgJmD2QWAgIHDxYCHgVzdHlsZQUMZGlzcGxheTpub25lZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUMSW1hZ2VCdXR0b24xBQbJTyYtlf3ourkm7fxeOcmpYzw=');
mytemp.WriteString('&__EVENTVALIDATION=/wEWCgLEyScCr6bqtggC0sXgkQ8C0ZmQhQYC2beJ5wUCxreJ5wUCwLeJ5wUCxLfJ5AUC5+SprQcC0sKZ0wj1f8FDhWTND1Zh/b9/60FHsmgDzQ==');

ss := TStringStream.Create('');
try
//IdHTTP1.Request.Referer := 'http://www.1disk.cn/index.aspx';// 引用页,实际上不需要
//IdHTTP1.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*';
//IdHTTP1.Request.AcceptLanguage := 'zh-cn';
//IdHTTP1.Request.AcceptEncoding := 'gzip, deflate';
IdHTTP1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; CustomExchangeBrowser; .NET CLR 1.1.4322)';
//IdHTTP1.Request.ContentType := 'text/html; charset=gb2312';

// 执行这句不能得到想要的页面,得到的是相关参数不正确,重登陆的页面。
// 在IE地址栏中直接输入'http://www.xxx.cn/login.aspx?username=111&password=222&save=0'可以正常登录
IdHTTP1.Post('http://www.xxx.cn/login.aspx',mytemp,ss); //
// 使用sniffer看到提交的数据中没有参数,而且使用的是HTTP/1.0协议,
// 修改IdHTTP的源码使之使用http/1.1协议也没用,仅仅改了协议,参数还是没有提交;
// 返回的代码是先是100,紧接着是200,在此程序调试得到的代码是200,下面这段调试代码不会执行
if IdHTTP1.ResponseCode = 100 then
begin
ss.WriteString('go on');
end;

//使用get方法肯定不对,该页面要求的是post的数据。执行会报错“HTTP/1.1 501 不支持”。
//IdHTTP1.Get('http:/www.xxx.cn/login.aspx?username=111&password=222&save=0',ss);

//IdHTTP1.Get('http://www.sohu.com',ss); // 测试get方法用,这个网站能返回正确数据

Memo2.Lines.Text := ss.DataString; // 如果正常,显示返回页面的源码

except
on e: Exception do
Memo2.Lines.Add(e.Message); // 显示错误信息
end;
end;

参数mytemp使用TStringList类型,结果是一样的。

直接在IE地址栏中输入“http://www.1disk.cn/login.aspx?username=111&password=222&save=0”,抓包看到的是
GET /login.aspx?username=111&password=222&save=0 HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)
Host: www.1disk.cn
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=ymumkkze5mdjiy450tuvn0ea; CheckCode=8A9B284CB4824E9F
它使用的竟然是Get方法,程序中测试过,已经说服务器不支持了。

而在delphi中执行抓包看到的是
POST /login.aspx HTTP/1.0
Connection: keep-alive
Content-Type: text/html
Content-Length: 351
Host: www.1disk.cn
Accept: text/html, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; CustomExchangeBrowser; .NET CLR 1.1.4322)

username=111&password=222&save=0&__VIEWSTATE=/wEPDwUKMTcyOTg0OTI5MQ9kFgJmD2QWAgIHDxYCHgVzdHlsZQUMZGlzcGxheTpub25lZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUMSW1hZ2VCdXR0b24xBQbJTyYtlf3ourkm7fxeOcmpYzw=&__EVENTVALIDATION=/wEWCgLEyScCr6bqtggC0sXgkQ8C0ZmQhQYC2beJ5wUCxreJ5wUCwLeJ5wUCxLfJ5AUC5+SprQcC0sKZ0wj1f8FDhWTND1Zh/b9/60FHsmgDzQ==

我输入的参数跑到后一段去了。
 
去找个网络硬盘的程序分析一下,看看服务器端做了什么。
 
对于网站程序我比较菜,没能分析出什么特别的东西来。
我找的就是 www.1disk.cn 上的免费版程序。
 
问题已经解决。
 
POST /login.aspx HTTP/1.0
应该是这句吧
现在大部分都是用HTTP/1.1
 
后退
顶部