![]() |
Frage zur Nutzung von ixmlhttprequest
Hallo
ich habe schon die Suche verwendet, aber nichts passendes gefunden. Ich habe aus dem Thread ![]() mit Indy hat das irgendwie nicht funktioniert (zugriff auf eine htaccess geschützte Seite).
Delphi-Quellcode:
Das Funktioniert auch an und für sich wunderbar.
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; 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 |
Re: Frage zur Nutzung von ixmlhttprequest
Wenn du nil zuweist sollte das ComObjekt freigegeben werden.
Delphi-Quellcode:
doc:=nil;
|
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 ![]() Neun |
Re: Frage zur Nutzung von ixmlhttprequest
Du müsstest auch den Status (siehe
![]() Der Status sollte 200 (=OK) sein. Zum HTTP-Status siehe auch ![]() Man braucht das Objekt nicht für jede HTTP-Anfrage zu zerstören und ein Neues zu erzeugen. |
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. |
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:
Nachtrag: Bugfix - beim Result hat noch die eigentliche URL gefehlt
// 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; |
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. |
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.
|
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 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz