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?????

解决方案 »

  1.   

    500错误,说明你的认证 有错误,看看用户吗密码等是否正确,一般密码都会加密的,你是否符合加密规则PostDataStream,是Utf8ToAnsi的参数,跟你post有啥关系
      

  2.   


    1.抓包的时候帐号和密码都是明文的。
    2.IdHTTP.Post('http://passport.cnblogs.com/login.aspx', ParamStr, PostDataStream);
    Delphi查看Post原形,只有两个参数。为什么这里可以填三个呢?
    function TIdCustomHTTP.Post(AURL: string; const ASource: TStrings): string; //
      

  3.   

    function TIdCustomHTTP.Post(AURL: string; const ASource: TStrings): string; 
    大哥,看清楚是几个参数
      

  4.   

    怎么没有人回答啊。晕死
    修改了下面这些值以后,提示HTTP/1.1 405 怎么做啊???
    ParamStr.Add('__EVENTTARGET=');
      ParamStr.Add('__EVENTARGUMENT=');
      

  5.   

    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]
      

  6.   

    参数前要加 &__
      

  7.   

    POST函数重载 几二个参数也有三个参数的
      

  8.   

    看了下你的代码,注释说字符串太长编译不了,是因为delphi中对字符直接量长度是限制的,如果你的字符串直接量太长,可以用'XXXXXXXXXXXXX' + 'xxxxxxxxxxxxxxxx' + .........这样的形式连接起来;500错误就是服务端出错,很可能你提交的数据格式不对,导致服务端解析时出错了;建议你用抓包工具抓到http发往服务器的数据包看看最终发出去的格式是怎么样的,这样才好分析原因。还有,你可以把Request.ContentLength设置成-1看看。
      

  9.   

    unit Unit1;interfaceuses
      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('&[email protected]');
    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错误。
      

  10.   

    抓自己的写的程序的封包 跟抓的网页的对比 
    这比自己看DELPHI提示错误 方便找原因了