IdHTTP.Post 模拟提交服务器 提示500错误

god00 2011-06-17 11:45:12
procedure TForm1.ButtonClick(Sender: TObject);
var
IdHttp:TIdHTTP;
PostDataStream:TStringStream;
ParamData:TStringStream;
ParamStr:TStringList;
Html:string;
begin
IdHttp := TIdHTTP.Create(nil);
IdHttp.ProtocolVersion := pv1_1;
IdHttp.Request.Accept := 'application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/QVOD, application/QVOD, application/x-ms-application, application/x-ms-xbap, application/xaml+xml, */*'; //这里有时候会出错,编译不过来的。是不是字符串太长了,我删减了一半就可以编译。
IdHttp.Request.AcceptEncoding := 'gzip, deflate';
IdHttp.Request.AcceptLanguage := 'zh-cn';
IdHttp.Request.CacheControl := 'no-cache';
IdHttp.Request.Connection := 'Keep-Alive';
IdHttp.Request.ContentLength := 371;
IdHttp.Request.ContentType := 'application/x-www-form-urlencoded';
IdHttp.Request.Host := 'passport.cnblogs.com';
IdHttp.Request.Referer := 'http://passport.cnblogs.com/login.aspx';
IdHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0E; .NET4.0C)';
IdHttp.HandleRedirects := True;

//以上这些数据是HttpWatch抓包的。不知道对不对。

PostDataStream := TStringStream.Create('');
ParamData := TStringStream.Create('');
ParamStr := TStringList.Create;
// ParamData.WriteString(''); //这个也是同样问题字符串太长就编译不过来了。
ParamStr.Add('__EVENTTARGET=');
ParamStr.Add('__EVENTARGUMENT=');
ParamStr.Add('__VIEWSTATE=%2FwEPDwULLTE1MzYzODg2NzZkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcm1QYDyKKI9af4b67Mzq2xFaL9Bt');
ParamStr.Add('__EVENTVALIDATION=%2FwEWBQLWwpqPDQLyj%2FOQAgK3jsrkBALR55GJDgKC3IeGDE1m7t2mGlasoP1Hd9hLaFoI2G05');
ParamStr.Add('tbUserName=帐号');
ParamStr.Add('tbPassword=密码');
ParamStr.Add('btnLogin=%E7%99%BB++%E5%BD%95');
ParamStr.Add('txtReturnUrl=http%3A%2F%2Fhome.cnblogs.com%2F');
IdHTTP.Post('http://passport.cnblogs.com/login.aspx', ParamStr, PostDataStream);
//运行到这里就提示 HTTP/1.1 500 Internal Server Erro 错误。
postdatastream.Position:=0;
memo1.Text:=Utf8ToAnsi(postdatastream.DataString);
PostDataStream.Free;
ParamData.Free;
ParamStr.Free;
end;

怎么解决啊????????

还有 IdHTTP.Post 这个Post函数原形只有两个参数,这里为什么会有第三个PostDataStream?????
...全文
812 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ADSLAN 2011-07-05
  • 打赏
  • 举报
回复
抓自己的写的程序的封包 跟抓的网页的对比
这比自己看DELPHI提示错误 方便找原因了
lxy8188 2011-07-04
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;

type
TForm1 = class(TForm)
Button1: TButton;
IdHTTP1: TIdHTTP;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const BaseURL = 'http://passport.cnblogs.com/login.aspx'; //地址
var
IdHTTP: TIdHTTP;
Params: TStrings;
RStream:TStringStream;
html:string;
begin
RStream:=TStringStream.Create('');
idHTTP:= TidHTTp.create(self);
Params := TStringList.Create;
IdHTTP.AllowCookies := True;
IdHTTP.HTTPOptions:=[hoForceEncodeParams];
IdHTTP.ProtocolVersion := pv1_1;
IDHTTP.Request.Accept:='*/*';
IdHTTP.Request.Referer:='http://passport.cnblogs.com/login.aspx';
IdHTTP.Request.AcceptLanguage := 'zh-cn';
IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP.Request.AcceptEncoding := 'gzip, deflate';
IdHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)';
IdHTTP.Request.Host := 'passport.cnblogs.com';
IdHTTP.Request.ContentLength := -1;
IdHTTP.Request.Connection := 'Keep-Alive';
IdHTTP.Request.CacheControl := 'no-cache';
Params.Append('__EVENTTARGET=');
Params.Append('&__VIEWSTATE=/wEPDwULLTE1MzYzODg2NzZkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcm1QYDyKKI9af4b67Mzq2xFaL9Bt');
Params.Append('&__EVENTVALIDATION=/wEWBQLWwpqPDQLyj/OQAgK3jsrkBALR55GJDgKC3IeGDE1m7t2mGlasoP1Hd9hLaFoI2G05');
Params.Append('&tbusername=13407432829@qq.com');
Params.Append('&btnLogin=%E7%99%BB++%E5%BD%95');
Params.Append('&tbpassword=voyeur');
Params.Append('&txtReturnUrl=http://home.cnblogs.com');
try
params.SaveToFile(ExtractFilePath(ParamStr(0))+'my.txt');
html:=Utf8ToAnsi(IdHTTP.Post('http://passport.cnblogs.com/login.aspx',Params));
memo1.Text:=html;
except
showmessage('error');
end;
showmessage(IdHttp.ResponseText);
IdHTTP.Disconnect;
FreeAndNil(IdHTTP);
FreeAndNil(Params);
end;
end.
我发生的是302错误。
biganchor 2011-06-23
  • 打赏
  • 举报
回复
看了下你的代码,注释说字符串太长编译不了,是因为delphi中对字符直接量长度是限制的,如果你的字符串直接量太长,可以用'XXXXXXXXXXXXX' + 'xxxxxxxxxxxxxxxx' + .........这样的形式连接起来;

500错误就是服务端出错,很可能你提交的数据格式不对,导致服务端解析时出错了;建议你用抓包工具抓到http发往服务器的数据包看看最终发出去的格式是怎么样的,这样才好分析原因。

还有,你可以把Request.ContentLength设置成-1看看。
ADSLAN 2011-06-21
  • 打赏
  • 举报
回复
POST函数重载 几二个参数也有三个参数的
guangfei1984 2011-06-18
  • 打赏
  • 举报
回复
账号或者密码不对,用另外一个试试
bdmh 2011-06-17
  • 打赏
  • 举报
回复
function TIdCustomHTTP.Post(AURL: string; const ASource: TStrings): string;
大哥,看清楚是几个参数
god00 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
500错误,说明你的认证 有错误,看看用户吗密码等是否正确,一般密码都会加密的,你是否符合加密规则

PostDataStream,是Utf8ToAnsi的参数,跟你post有啥关系
[/Quote]

1.抓包的时候帐号和密码都是明文的。
2.IdHTTP.Post('http://passport.cnblogs.com/login.aspx', ParamStr, PostDataStream);
Delphi查看Post原形,只有两个参数。为什么这里可以填三个呢?
function TIdCustomHTTP.Post(AURL: string; const ASource: TStrings): string; //
bdmh 2011-06-17
  • 打赏
  • 举报
回复
500错误,说明你的认证 有错误,看看用户吗密码等是否正确,一般密码都会加密的,你是否符合加密规则

PostDataStream,是Utf8ToAnsi的参数,跟你post有啥关系
zhuang_bx 2011-06-17
  • 打赏
  • 举报
回复
参数前要加 &__
zhuang_bx 2011-06-17
  • 打赏
  • 举报
回复
ParamStr.Add('__EVENTTARGET=');
ParamStr.Add('&_VIEWSTATE=%2FwEPDwULLTE1MzYzODg2NzZkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcm1QYDyKKI9af4b67Mzq2xFaL9Bt');
ParamStr.Add('color=#FF0000]&[/color]_EVENTVALIDATION=%2FwEWBQLWwpqPDQLyj%2FOQAgK3jsrkBALR55GJDgKC3IeGDE1m7t2mGlasoP1Hd9hLaFoI2G05');
ParamStr.Add('color=#FF0000]&[/color]tbUserName=帐号');
ParamStr.Add('color=#FF0000]&[/color]tbPassword=密码');
ParamStr.Add('color=#FF0000]&[/color]btnLogin=%E7%99%BB++%E5%BD%95');
ParamStr.Add('color=#FF0000]&[/color]txtReturnUrl=http%3A%2F%2Fhome.cnblogs.com%2F');

参数前要加color=#FF0000]&[/color]
god00 2011-06-17
  • 打赏
  • 举报
回复
怎么没有人回答啊。晕死。。。
修改了下面这些值以后,提示HTTP/1.1 405 怎么做啊。。。。。。。。。???
ParamStr.Add('__EVENTTARGET=');
ParamStr.Add('__EVENTARGUMENT=');
god00 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]
function TIdCustomHTTP.Post(AURL: string; const ASource: TStrings): string;
大哥,看清楚是几个参数
[/Quote]

啊?-_-# 照你这样说,返回值也可以写进括号里啊? 这个暂不管它。

整个代码运行还是提示500错误 怎么做啊。我跟别人的代码书写也没什么两样。但是别人也没有提示错误

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧