WinHTTP - Welche Besonderheiten sind zu beachten?

  • Hey,

    ich möchte von einen webserver (lokales Netzwerk) verschiedene Daten abfragen.
    Der Webserver (DVBViewer -> Recordingservice) gibt ein .xml Dokument zurück.

    Bis jetzt bin ich über die IE.au3 Funktionen gegangen, allerdings stürzt mir am Sever ständig der IE ab (ka warum) und dann funktioniert mein Skript nichtmehr.
    Also mal ein Versuch über die WinHTTP.au3 Variante.

    Spoiler anzeigen
    [autoit]


    #include <IE.au3>
    #include <WinHTTP.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ip = '192.168.1.101' ; Port 80
    Global $port = 80

    [/autoit] [autoit][/autoit] [autoit]

    _IE()
    _WinHTTP()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _IE()
    Local $check = "http://" & $ip & ":" & $port & "/api/status.html"
    Local $oIE = _IECreate($check, 0, 0)
    Local $sHTML = _IEBodyReadText($oIE)
    _IEQuit($oIE)
    ;ConsoleWrite($sHTML & @crlf)
    MsgBox(0, "IE", $sHTML) ;debug
    EndFunc ;==>_IE

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinHTTP()

    [/autoit] [autoit][/autoit] [autoit]

    local $hw_open = _WinHttpOpen("CI_reset_tool")
    local $hw_connect = _WinHttpConnect($hw_open, $ip)
    local $h_openRequest = _WinHttpOpenRequest($hw_connect, "GET", "/api/status.html")
    _WinHttpSendRequest($h_openRequest)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    local $data = _WinHttpReadData($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    _WinHttpCloseHandle($hw_connect)
    _WinHttpCloseHandle($hw_open)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(1, "WinHTTP", $data)
    EndFunc ;==>_WinHTTP

    [/autoit]

    Es funktioniert auch scheinbar, allerdings fehlt mir die Zeit das wirklich zu testen und von dem Skript hängen "wichtige" TV-Aufnahmen ab.
    Die erhaltenen Daten sind dafür unverzichtbar.

    Daher die Frage ob ich das grundsätzlich richtig angegangen bin.
    Wo würde ein benötigter Benutzername und das Passwort eingetragen? Einfach zur URL wie in der Doku?

    Die Doku vom Webserver:

    Code
    URL=http://[user:password@]IP[:port]/api
    Statusabfrage => URL/status.html

    So das wars schon :)

    Gruß nuts

  • Das sollte so fast stimmen, falls du kein Passwort verwendest. Auslesen musst du aber in einer Schleife und WinHTTP würde ich ganz zu Beginn starten und erst bei Skriptende wieder schließen.

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <WinHTTP.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hw_open = _WinHttpOpen("CI_reset_tool")
    OnAutoItExitRegister("_Cleanup")
    Func _Cleanup()
    _WinHttpCloseHandle($hw_open)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Global $ip = '192.168.1.101' ; Port 80
    Global $port = 80

    [/autoit] [autoit][/autoit] [autoit]

    _WinHTTP()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _WinHTTP()
    local $hw_connect = _WinHttpConnect($hw_open, $ip)
    local $h_openRequest = _WinHttpOpenRequest($hw_connect, "GET", "/api/status.html")
    _WinHttpSendRequest($h_openRequest)
    _WinHttpReceiveResponse($h_openRequest)

    Local $data=""
    Do
    $data &= _WinHttpReadData($h_openRequest)
    Until @extended=0 Or @error<>0

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    _WinHttpCloseHandle($hw_connect)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(1, "WinHTTP", $data)
    EndFunc ;==>_WinHTTP

    [/autoit]


    Solltest du Benutzer und Passwort benötigen, musst du weitere Funktionsaufrufe einbauen.

    Theoretisch sollte auch ein InetRead und anschließendes BinaryToString für deine Zwecke vollkommen ausreichen:

    [autoit]

    $bData = InetRead("http://[user:password@]IP[:port]/api/status.html", 1)
    MsgBox(0, "", BinaryToString($bData))

    [/autoit]
  • Solange dein PC nicht abstürzt oder sonst was macht(z.B. die IP wechselt :D )