Delphi - Indy (IDHTTP) Halten Sitzung
Ok, ich habe Idhttp dynamisch erstellt, wie die folgenden
procedure TForm1.Button1Click(Sender: TObject);
Var
Resp : String;
begin
Resp := webSession('https://www.website.com'); // HTTPS site requires session to keep alive
if Length(Resp)>0 then
MessageDlg('Got the body ok',mtInformation,[mbOk],0);
end;
function TForm1.webSession(sURL : ansistring) : ansistring;
var
SStream : Tstringstream;
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
CompressorZLib: TIdCompressorZLib;
ConnectionIntercept: TIdConnectionIntercept;
SSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
CookieManager: TIdCookieManager;
begin
CompressorZLib := TIdCompressorZLib.Create;
ConnectionIntercept :=TIdConnectionIntercept.Create;
SSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
Result := '';
if Length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0
Try
SStream := NIL;
AntiFreeze := NIL;
HTTPCon := NIL;
Try
SStream := tstringstream.Create('');
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.create;
HTTPCon.AllowCookies:=true;
HTTPCon.CookieManager :=CookieManager;
HTTPCon.Compressor := CompressorZLib;
HTTPCon.Intercept := ConnectionIntercept;
HTTPCon.IOHandler := SSLIOHandlerSocketOpenSSL;
HTTPCon.HandleRedirects := true;
{ Check Proxy }
if checkproxy('http://www.google.com') then
Begin
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
End;
{ Create another AntiFreeze - only 1/app }
AntiFreeze := TIdAntiFreeze.Create(nil);
AntiFreeze.Active := true;
HTTPCon.Get(sURL,SStream);
Result := UTF8ToWideString(SStream.DataString);
Finally
If Assigned(HTTPCon) then FreeAndNil(HTTPCon);
If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
If Assigned(SStream) then FreeAndNil(SStream);
If Assigned(CookieManager) then FreeAndNil (CookieManager );
If Assigned(CompressorZLib) then FreeAndNil (CompressorZLib );
If Assigned(ConnectionIntercept) then FreeAndNil (ConnectionIntercept );
If Assigned(SSLIOHandlerSocketOpenSSL) then FreeAndNil (SSLIOHandlerSocketOpenSSL);
End;
Except
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;
function TForm1.checkproxy(sURL : ansistring) : boolean;
var
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
begin
Result := False;
Try
{ Inti vars }
AntiFreeze := NIL;
HTTPCon := NIL;
Try
{ AntiFreeze }
AntiFreeze := TIdAntiFreeze.Create(NIL);
AntiFreeze.Active := true;
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.Create(NIL);
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
HTTPCon.HandleRedirects := true;
HTTPCon.ConnectTimeout := 1000;
HTTPCon.Request.Connection := 'close';
HTTPCon.Head(sURL);
Finally
{ Cleanup }
if Assigned(HTTPCon) then
Begin
{ Return Success/Failure }
Result := HTTPCon.ResponseCode = 200;
If HTTPCon.Connected then HTTPCon.Disconnect;
FreeAndNil(HTTPCon);
End;
if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
End;
Except
On E:EIdException do ;
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;
Ich habe eine website, die verlangt mich zu halten, eine Sitzung aktiv. Wie kann ich dies tun? Mit ähnlicher code oben.
Ist, wenn ich eine visuelle Komponente für alles, und verwenden Sie es, alles ist toll, aber wenn ich dynamisch erstellen der Komponente (die ich WIRKLICH wollen, es zu verlassen auf diese Weise) es fehl, damit die Sitzung aktiv.
Jede Hilfe ist willkommen.
InformationsquelleAutor Brad | 2010-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht sehen, wo Sie instanziieren
CookieManager
, aber das ist, wo Sie sollten verfolgen die Sitzung. Der server sendet einige Cookies, die für die aktuelle Sitzung, und alle weiteren Anfragen, die Sie senden, bis der server sollte beinhalten, dass die cookie, damit der server weiß, welche session zu verwenden.Müssen Sie entweder die cookie-manager-Objekt, um für die Dauer der Sitzung, oder Sie haben um seine Daten zu speichern, woanders und dann wieder geladen jedes mal, wenn Sie erstellen Sie einen neuen cookie-manager-Objekt. Ich würde es bevorzugen die ehemalige. In der Tat könnte man erwäge, den gesamten HTTP-Objekt um.
InformationsquelleAutor Rob Kennedy
Als Sie erwähnt in Ihren Kommentaren, die Sie erstellen, CookieManager im OnCreate event-handler, so dass, wenn TForm1.webSession ist aufgerufen, CookieManager ist verfügbar, aber in den finally-block von TForm1.webSession Sie zu befreien, CookieManager, so, wenn Sie verlassen TForm1.webSession-Methode, CookieManager ist out of memory. Also, Nächstes mal TForm1.webSession ist aufgerufen, CookieManager ist gleich Null, und kein cookie ist für Sie gespeichert.
Gibt es zwei weitere Hinweise, die nicht im Zusammenhang deiner Frage, aber sind mit Ihren source-code:
1 - Methode zurück AnsiString, aber Sie sind mit Utf8ToWideString für die Zuweisung der Wert der Variablen Result. Utf8ToWideString gibt WideString, also compiler zu konvertieren, WideString, AnsiString, und nicht nur dies reduziert die Leistung, aber auch Sie verliert die unicode-Zeichen in der Rückgabe-string. Sollten Sie Ihre Signatur der Methode zurückzukehren, entweder String (D2009 & D2010) oder WideString (bei Älteren Versionen von Delphi).
2 - Sie brauchen nicht zu prüfen, ob SStream, Frostschutzmittel, oder HTTPCon zugeordnet sind, in den finally-block. Rufen Sie einfach die Kostenlose Methode, oder verwenden Sie FreeAndNil Verfahren.
Hinsichtlich
InformationsquelleAutor vcldeveloper
Als Rob sagte Ihr TIdCookieManager ist der Schlüssel für die Aufrechterhaltung einer Cookie-basierten session. Die TIdCookieManager geschaffen werden könnten, in einem datamodule ' s Ereignis erstellen oder die mainforms OnCreate () - Ereignis und legen Sie dann jedes mal, wenn Sie erstellen eine IdHTTP-Komponente.
Kein problem, gerne helfen! - Haben Sie schaute in die Verwendung von threads für die Kommunikation Teile? Könnte er für eine glattere Fahrt, wenn es sein kann in Ihrem code implementiert?
Ja, habe ich ein Gewinde-demo, aber der Durchzug gerade über meine aktuellen Kenntnisse in Delphi. Und eine Menge von dem, was dieses Projekt nicht ist, Kontaktieren Sie die website-immer und immer wieder, so dass ich nicht brauchen/wollen mehrere Anfrage für diese ein. Aber ich benutze den gleichen Basis-code in ein paar andere Projekte, und es wäre schön, der thread. Haben Sie irgendwelche Vorschläge auf eine gute demo-thread?
Dies ist ein ziemlich großes Thema, so eine neue Frage, vielleicht der beste Weg zu gehen. Ich kann auf jeden Fall helfen, aber die genaue Umsetzung kann unterschiedlich sein, je nach Nutzung und Bedarf...
InformationsquelleAutor K.Sandell