2016-06-16 32 views
2

Ich möchte Post-Anfrage wie folgt senden, indem Programm in Delphi geschrieben wird. Reuquest of web browser Es gibt ein Cookie-Feld im Anfrage-Header (im roten Rechteck). Ich habe folgenden Quellcode geschrieben.Fügen Sie Cookie-Feld zum Header der Post-Anfrage

procedure TForm1.Button2Click(Sender: TObject); 
var 
    uri : TIdURI; 
    cookie : TIdCookieManager; 
    HTTP : TIdHTTP; 
    vals: TStringList; 
    url : String; 
    response : TStringStream; 
begin 
    HTTP := TIdHTTP.Create(); 
    HTTP.AllowCookies := True; 
    HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
    HTTP.HandleRedirects := True; 
    cookie := TIdCookieManager.Create(); 
    uri := TIdURI.Create('www.hoge.com'); 
    cookie.AddServerCookie('ASP.NET_SessionId=test', uri); 
    HTTP.CookieManager := cookie; 
    vals := TStringList.Create; 
    response := TStringStream.Create(''); 
    vals.Add('__EVENTTARGET='); 
    vals.Add('__EVENTARGUMENT='); 
    vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A='); 
    vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C'); 
    vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg=='); 
    vals.Add('ddlLanguage=ja-JP'); 
    vals.Add('tbUserId=myid'); 
    vals.Add('tbPassword=hoge'); 
    vals.Add('btnLogin=login'); 

    url := TIdURI.ParamsEncode('ReturnUrl=/GssNet/main/default.aspx'); 
    url := TIdURI.URLEncode('www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx'); 
    try 
     HTTP.Post('http://www.hoge.com/GssNet/login,aspx', vals, response); 
    Except 
     on EIdHTTPProtocolException do 
     begin 
      ShowMessage(Memo1.TextHint); 
     end; 
    end; 
end; 

Das Cookie-Feld ist jedoch nicht im Anfrage-Header enthalten. Das folgende ist das Ergebnis der Paketerfassung. wenn ich mein Programm ausführe. Bitte bringen Sie mir bei, wie Sie ein Cookie-Feld zum Anfrage-Header hinzufügen können.

Rquest of my program

+1

Vielleicht hilfreich: http://stackoverflow.com/questions/13235897/transfer-authentication-from-webbrowser-in-indy-cookiemanager/13239097#13239097 – mjn

+1

Haben Sie versucht, die URI mit http erstellen? 'TIdURI.Create ('http://www.hoge.com/');' – smooty86

Antwort

2

Wie @ smooty86 sagte in den Kommentaren, müssen Sie den http:// Teil der URL enthalten, wenn sie manuell ein Cookie hinzufügen. Sie müssen auch den vollständigen Pfad zu der Ressource angeben, die angefordert wird. Andernfalls ist das Cookie nur für Anforderungen an den Stammpfad / gültig.

Auch Ihre Anrufe zu TIdURI.ParamsEncode() und TIdURI.URLEncode() sind nutzlos, da Sie nicht die codierte url Variable verwenden. Wenn Sie sich die Zeit nehmen, eine URL zu verschlüsseln, stellen Sie sicher, dass Sie sie tatsächlich verwenden.

Sie verlieren auch alle Ihre Objekte.

Versuchen Sie stattdessen:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    uri : TIdURI; 
    HTTP : TIdHTTP; 
    vals : TStringList; 
    url : String; 
    response : TStringStream; 
begin 
    try 
    response := TStringStream.Create(''); 
    try 
     vals := TStringList.Create; 
     try 
     vals.Add('__EVENTTARGET='); 
     vals.Add('__EVENTARGUMENT='); 
     vals.Add('__VIEWSTATE=/wEPDwUINzcxNjQyMjkPFgIeE1ZhbGlkYXRlUmVxdWVzdE1vZGUCAWRkEHyFbwQQE8tM5FKRr3UELd00osRNQBzu31XZl1yd86A='); 
     vals.Add('__VIEWSTATEGENERATOR=A7C0DD1C'); 
     vals.Add('__EVENTVALIDATION=/wEdAAZkcRcs1jgA2rEUAtpu7qzIhFuNiVVNuLciluwM7Vty0gJCK50467l5FRCktGxHOlNKe/Y7d9SBufbGEp2w5OLHqFe59uEio+bAp/33YZOR3aKeKEbp39eHc9mbdvkCgxAPflO5NLAHc5uwdZn6JOnwKMi9h+dluqFLpmg3gO25cg=='); 
     vals.Add('ddlLanguage=ja-JP'); 
     vals.Add('tbUserId=myid'); 
     vals.Add('tbPassword=hoge'); 
     vals.Add('btnLogin=login'); 

     HTTP := TIdHTTP.Create; 
     try 
      HTTP.HandleRedirects := True; 
      HTTP.AllowCookies := True; 
      HTTP.CookieManager := TIdCookieManager.Create(HTTP); 

      uri := TIdURI.Create('http://www.hoge.com/GssNet/login,aspx'); 
      try 
      HTTP.CookieManager.AddServerCookie('ASP.NET_SessionId=test', uri); 
      finally 
      uri.Free; 
      end; 

      url := TIdURI.URLEncode('http://www.hoge.com/GssNet/login,aspx?ReturnUrl=/GssNet/main/default.aspx'); 

      HTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
      HTTP.Post(url, vals, response); 
     finally 
      HTTP.Free; 
     end; 
     finally 
     vals.Free; 
     end; 

     // use response as needed... 
    finally 
     response.Free; 
    end; 
    except 
    on EIdHTTPProtocolException do 
    begin 
     ShowMessage(Memo1.TextHint); 
    end; 
    end; 
end; 

Schließlich, warum Sie eine Anfrage an login,aspx schicken? Der korrekte Name lautet stattdessen login.aspx. login,aspx ist nicht auf dem Server vorhanden.

+0

Vielen Dank für Ihre Antwort. Ich habe Post-Anfrage mit Cookie durch Hinzufügen von Protokoll zu UrI und Fix Fehlbuchstabierung "Login, aspx". :) – kuni255