2017-06-28 3 views
0

Ich versuche, Anwendung zu erstellen, die Sitzung mit IDhttp 10.5.7 auf Delphi XE unterstützt, aber die Sitzung immer jedes Mal geändert, wenn ich die Anfrage aufrufen.Sitzung nicht mit Indy 10 IDhttp und Delphi XE

Aber ich benutze den gleichen Code in Delphi 2006 mit Indy 10.1.5 die Sitzung erfolgreich gepflegt, auch wenn ich die Anfrage mehrmals anrufe es nur 1 Sitzung erstellen.

Wie löse ich dieses Problem in Delphi XE?

unit Unit1; 

interface 

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

type 
    TForm1 = class(TForm) 
    HTTP: TIdHTTP; 
    Button1: TButton; 
    Memo1: TMemo; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    function get_dataweb(url: string): string; 
    procedure OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean); 
    { Private declarations } 
    public 
     Stream : TStringStream; 
     cookie : TIdCookieManager; 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var hasil : string; 
begin 
    hasil := get_dataweb('http://localhost/web/tes.php'); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Stream := TStringStream.Create; 
    cookie := TIdCookieManager.Create; 
    cookie.OnNewCookie := OnNewCookie; 
    HTTP.CookieManager := cookie; 

end; 

procedure TForm1.OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean); 
begin 
    memo1.Lines.Add(ACookie.CookieText); 
end; 

function TForm1.get_dataweb(url:string):string; 
var hasil : string; 
begin 

    stream.Position  := 0; 
    stream.Size   := 0; 

    http.AllowCookies  := True; 
    http.HandleRedirects := True; 
    HTTP.ReadTimeout  := 0; 
    HTTP.ConnectTimeout := 0; 

    HTTP.Request.CustomHeaders.clear; 
    HTTP.Request.CustomHeaders.Add('user:user'); 
    HTTP.Request.CustomHeaders.Add('password:password'); 
    HTTP.request.useragent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; 

    try 
    http.get(url,Stream); 
    hasil := Stream.DataString; 
    except 

    on E: EIdHTTPProtocolException do 
    begin 
     hasil := E.ErrorMessage; 
     result := hasil; 
     exit; 
    end; 
    on E: Exception do 
    begin 
     ShowMessage('Failed, ' + E.Message + #13#10 + ' ' + hasil); 
    end; 
    end; 

    result := hasil; 
end; 


end. 

3 mal geklickt ich die Taste, 3-mal neue Sitzung

erstellt

3 times i clicked the button, 3 times new session created

+0

10.5.7 ist sehr alt, die aktuelle Version ist 10.6.2. In jedem Fall ist dies eindeutig ein Cookie-Problem. Das Cookie-Management hat sich seit 10.1.5 und sogar 10.5.7 stark verändert, um den modernen Cookie-Praktiken besser zu folgen. Ihre alten 'TIdHTTP' werden also entweder die Cookies verwerfen oder sie werden nicht zurück an den Server gesendet, weil sie denken, dass sie nicht mit den Anforderungen übereinstimmen. Das würde erklären, warum bei jeder Anfrage neue Sitzungen erstellt werden. Ich kann dieses Problem in 10.6.2 nicht reproduzieren, Sitzungen werden wie erwartet wiederverwendet. –

Antwort

0

Vielen Dank für die Anregung Remy, ich habe meine Indy zu 10.6.2 und das Problem gelöst aufgewertet. Ich folgte this Tutorial erfolgreich