VB (VBScript) HTTP-Requests

DaPhreak

Primus inter pares
ID: 30143
L
8 Mai 2006
2.418
295
Hallo alle,

Der Präfix passt nicht ganz, meine Frage bezieht sich nicht auf VB sondern auf VBS. Ich hatte VBS ehrlich gesagt Jahrelang sträflich ignoriert (Ihh, Basic), aber in letzter Zeit doch irgendwie ein bisschen für mich entdeckt. Um kleinere Dinge unter Windows zu automatisieren ohne auf eine Konsole beschränkt zu sein (BAT/CMD) und ohne nen Compiler oder Interpreter aufsetzen zu müssen ist es manchmal nicht schlecht. Die Sprache selbst ist zwar 'ne ziemliche Katastrophe, aber ich will ja keine großen Softwareprojekte entwickeln. :biggrin:

Zu meiner Frage: Ich will in einem VBS in bestimmten Zeitabständen Aktionen ausführen und deren Erfolg an einen Webserver melden. Ersteres läuft schon länger, für zweiteres will ich einfach ein kleines PHP-Script abrufen und den Status per GET übermitteln. Was ich also brauche ist eine einfache wget-Funktionalität in VBS. Dazu habe ich 'nen Snippet gefunden, der sich bei mir, da ich die Antwort des Servers nicht benötige, vereinfacht zu

Code:
strFileURL = "https://example.org/ping.php?status=123"
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()

Das funktioniert auch wunderbar. Aber jetzt kommts: wenn ich in dem gleichen Script einen zweiten Request ausführen will, dann wird dieser nicht ausgeführt. Das Minimalbeispiel dazu wäre:

Code:
strFileURL = "https://example.org/ping.php?status=123"
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()

WScript.Sleep 10000

objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()

Hier wird nur der erste ausgeführt. Ich habe auch schon probiert vor dem zweiten Request das objXMLHTTP neu anzulegen (durch einen zweiten CreateObject-Aufruf mit dem obligatorischen Set auf Nothing vorher), das geht eben so wenig. Ich bekomme in beiden Fällen als objXMLHTTP.Status eine 200, als ob alles ok wäre.

Ein Timing-Problem kann es eigentlich nicht sein, dass false nach dem open sorgt dafür, dass der Request nicht asynchron ausgeführt wird, der open-Aufruf blockiert also bis er die Antwort hat.

Hat zufällig jemand eine Idee woran das liegen könnte oder wie ich es anders lösen könnte? Was VBS angeht bin ich ein ziemlicher Noob. ;)
 
Moin,

VBScript hab ich so noch nie gemacht, aber vielleicht kann ich dir ja trotzdem weiterhelfen.
Was ich also brauche ist eine einfache wget-Funktionalität in VBS.
Hier weiß ich ned, obs für dich nicht in Frage kommt, oder du es einfach nur nicht kennst: wget gibts auch für Windows :D

Ich habe auch schon probiert vor dem zweiten Request das objXMLHTTP neu anzulegen (durch einen zweiten CreateObject-Aufruf mit dem obligatorischen Set auf Nothing vorher), das geht eben so wenig.
Das wundert mich jetzt doch ein wenig. Eine Art Reset-Methode gibt es nicht, also wäre die Logik, dass du ein zweites Objekt anlegst.

Ich hab dir mal den Link zur Doku rausgesucht:
https://msdn.microsoft.com/en-us/library/ie/ms535874(v=vs.85).aspx

Da steht aber nix von zwei Requests. (Vielleicht kannst du dich ja mit dem wget schon anfreunden :))
 
Hier weiß ich ned, obs für dich nicht in Frage kommt, oder du es einfach nur nicht kennst: wget gibts auch für Windows :D

GnuWin64? Wäre ne Option. Müsste ich dann quasi als externes Programm aufrufen.

Mir hats halt gefallen, dass ich im VBS alles zur Verfügung habe, den Response-Status und ggf. sogar den ganzen body falls das Script noch ne Ausgabe macht.

Aber ok im konkreten Fall wäre die Funktionalität verzichtbar.

Wobei ich dann natürlich auch ein separates VBS machen könnte was ich aufrufe, 1 Request pro Scriptlaufzeit geht ja. :D

Das wundert mich jetzt doch ein wenig. Eine Art Reset-Methode gibt es nicht, also wäre die Logik, dass du ein zweites Objekt anlegst.

Ich hab dir mal den Link zur Doku rausgesucht:
https://msdn.microsoft.com/en-us/library/ie/ms535874(v=vs.85).aspx

Danke. Neues Objekt anlegen habe ich ja quasi probiert. Ich kann halt das alte nicht wirklich freigeben, nur auf Nothing setzen. Vermute mal die Garbage Collection nimmt sich dann dessen an. Schon komisch, dass das nicht geht.