Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Frage zur Nutzung von ixmlhttprequest (https://www.delphipraxis.net/123751-frage-zur-nutzung-von-ixmlhttprequest.html)

Tanc 7. Nov 2008 18:40


Frage zur Nutzung von ixmlhttprequest
 
Hallo

ich habe schon die Suche verwendet, aber nichts passendes gefunden.
Ich habe aus dem Thread hier eine Funktion aufgebaut um mit (!) Passwort und Username auf eine WEbstie zuzugreifen,
mit Indy hat das irgendwie nicht funktioniert (zugriff auf eine htaccess geschützte Seite).

Delphi-Quellcode:
function downloadData(URL,login,pw :String):String;
var
doc:IXMLHTTPRequest;
begin
doc:= coXMLHTTP.Create;
doc.open('GET',URL,false,login,pw);
doc.send(EmptyParam);

result := doc.responseText;
end;
Das Funktioniert auch an und für sich wunderbar.
Jedoch lässt sich die Funktion kein zweites mal nutzen, weil aus irgendeinem Grund keine neu Verbindung aufgebaut wird. D.h. ich muss immer erst das Programm neustarten damit
neue Daten heruntergeladen werden können.
Nun hab ich vermutet das in der Funktion ein doc.free fehlt, aber nach dem Tutorial soll die Freigabe ja automatisch funktionieren.
Wie kann ich es nun machen das ich beliebig oft die Funktion ohne das Programm neu zu starten verwenden kann.
Gibt es irgendeine Lösung für mein Problem ? Oder hab ich nur einen Fehler gemacht ?

mfg Tanc

generic 7. Nov 2008 23:28

Re: Frage zur Nutzung von ixmlhttprequest
 
Wenn du nil zuweist sollte das ComObjekt freigegeben werden.
Delphi-Quellcode:
doc:=nil;

NineBerry 8. Nov 2008 00:41

Re: Frage zur Nutzung von ixmlhttprequest
 
Hallo

Bekommst du eine Fehlermeldung? Was steht denn in doc.responseText? Einfach leer? Was steht denn in den anderen Eigenschaften von doc?

Passiert das auch, wenn du einfach den Text einer Standardseite wie http://www.heise.de abrufst oder nur bei deiner speziellen Adresse?

Neun

sx2008 8. Nov 2008 01:43

Re: Frage zur Nutzung von ixmlhttprequest
 
Du müsstest auch den Status (siehe http://msdn.microsoft.com/en-us/libr...25(VS.85).aspx) auswerten.
Der Status sollte 200 (=OK) sein.
Zum HTTP-Status siehe auch http://de.wikipedia.org/wiki/HTTP-Statuscode

Man braucht das Objekt nicht für jede HTTP-Anfrage zu zerstören und ein Neues zu erzeugen.

Tanc 8. Nov 2008 16:30

Re: Frage zur Nutzung von ixmlhttprequest
 
Also, doc := nil hatte ich schon versucht :/ hat nichts geändert.

Der Http Status Code ist immer 200, wenn ich die Funktion nochmal aufrufe, steht im ResponseText immernoch das selbe wie beim ersten Aufruf.

Das Problem hab ich erst gemerkt, als ich festgestellt hatte das die Internetseite die ich damit laden will sich verändert hat, aber die Daten die ich durch die Funktion bekomme immer die selben geblieben sind. Dann hab ich mit Wireshark geschaut ob überhaupt eine Verbindung aufgebaut wird. Beim ersten Aufruf nach Programmstart wird perfekt eine Verbindung über Port 80 aufgebaut. Statuscode ist immer 200, und ich empfange die Daten. Bei jedem weiteren Aufruf wird aber keine Verbindung mehr aufgebaut. Es wird das was im responseText und in den Statustext steht einfach erneut ausgegeben. Das selbe gilt für andere Websites. Die Daten werden beim ersten Aufruf geladen, später wird keine erneute Verbindung aufgebaut. (laut Wireshark) Wenn ich nun meinetwegen als 1. Adresse heise nehme, und aufrufe, dann läd er erstmal den Quellcode runter. Wenn ich nun die Adresse meinetwegen zu google.de ändere, läd er von google den QC in den responseText. WEnn ich jetzt wieder die URL von heise nehme, läd er den Quellcode von heise.de auch in den ResponseText, es wird aber trotzdem keine erneute Verbindung zum Server aufgebaut.

Fehlermeldungen erhalte ich keine.

sx2008 8. Nov 2008 18:43

Re: Frage zur Nutzung von ixmlhttprequest
 
Hier wird der Cache des Internet Explorers wirksam.
Man kann den Cache austricksen, indem man die URL jedesmal ändert:
Delphi-Quellcode:
// aus [url]http://www.test.de/info.html[/url] wird dann
// [url]http://www.test.de/info.html?random_param=3623[/url]
// falls die URL schon Parameter haben sollte, wird der parameter mit & angehängt
// ungetestet, sollte aber funktionieren
function RandomizedURl(const URL:string):string;
   function RPart:string;
   begin
     Result := 'random_param='+IntToStr(random(32768));
   end;
begin
  if Pos('?', URL) <> 0 then
    Result := URL + '&'+RPart
  else
    Result := URL + '?'+RPart;
end;
Nachtrag: Bugfix - beim Result hat noch die eigentliche URL gefehlt

Tanc 8. Nov 2008 19:45

Re: Frage zur Nutzung von ixmlhttprequest
 
Danke für den Trick, beim Result hat noch die eigentliche URL gefehlt, aber ansonsten geht die Funktion :)

Schade das der Cache es da unmöglich macht eine aktualisierte Fassung der Seite zu laden.

Damit ist aber mein Problem auch gelöst :)

Edit: Wobei mich natürlich trotzdem interessieren würde ob es eine andere Möglichkeit gibt den Cache zu umgehen/auszuschalten, nur der Vollständigkeit halber.

NineBerry 8. Nov 2008 20:41

Re: Frage zur Nutzung von ixmlhttprequest
 
Wenn der Server-Teil auch von dir stammt, kannst du dort HTTP-Header senden, die den Browser veranlassen, die Seite nie zwischenzuspeichern.

generic 10. Nov 2008 09:53

Re: Frage zur Nutzung von ixmlhttprequest
 
den Cache kannst du umgehen in dem du an die Url immer einen neuen Parameter anhängst.

Code:
http://www.tolledomain.de/index.php?irgwendes=<hier eine Zahl und die bei jedem Request hochzählen>


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz