Winhttp.au3 / requests

  • Moin,

    ich nutze die Winhttp.au3 nun für eine API Ansteuerung.

    Das klappt auch (dank guter Doku der API) ganz gut, nun habe ich einen Block, wo ich nicht weiß wie ich diesen übergeben muss:

    Kann mir jemand sagen wie ich den "-d" block übergebe?

    Bin leider nicht so bewandert in http und stehe sicherlich einfach auf dem Schlauch. :/

  • Google => man curl: https://curl.se/docs/manpage.html#-d

    -d ist also der data block in ascii form => String

    Der Inhalt sieht auch nach JSON aus, das passt also.

    _WinHttpSimpleRequest($hConnect, $sType = Default, $sPath = Default, $sReferrer = Default, $sData = Default, $sHeader = Default, $fGetHeaders = Default, $iMode = Default) hat ein $sData feld, dass dafür da sein dürfte.

    Also würde ich das hier versuchen:

    AutoIt
    $sData = '[{"Feldname1": "Wert1", "Feldname2": "Wert2"}]'
    $sHeader = 'header-1: The Header '&@crlf&"header-2: lines"
    $sPath = "www.google.com/search"
    $hHttp = _WinHttpOpen()
    $hConn = _WinHttpConnect($hHttp, "http...") ; http... bis zum ersten / (exclusive) => die domain => (www.google.com)
    $sResult = _WinHttpSimpleRequest($hConn, "POST", "/rest of the path", Default, $sData, $sHeader, Default, Default) ; Last one may be 0 -> Ascii; 1->UTF-8, 2->Binary
    ; /rest of the path after the first / (inclusive) => (/search)
    _WinHttpCloseHandle($hConn)
    _WinHttpCloseHandle($hHttp)

    Ich habs nicht getestet und mir nur die UDF angesehen, aber es sollte so funktionieren.

  • Ich nutze aktuell _WinHttpSendRequest($hRequest, Default, $OptionalData) und nicht die Simple Variante.

    Dies funktionierte bisher sehr gut aber da brauchte ich die zusätzlichen Daten aber auch noch nicht.

  • Ich habe das nun noch etwas angepasst, da ich gesehen habe das dort noch weitere Header zeilen benötigt werden, bekomme aber immer noch nicht das korrekte Ergebnis:

    Die zu übergebenden Daten sollen in den Request Body, falls das hilft.

    Ich bekomme immer "400" (wrong data) als response code.

    3 Mal editiert, zuletzt von Moombas (16. August 2022 um 15:09)

  • Das kann dan eigentlich nur auf die zu übertragenen Daten passen, da alle anderen Anfragen (wo diese nicht benötigt wurden/werden) einwandfrei funktionieren.

    Ich bin verwirrt.

    Es wäre hilfreich wenn man den generierten Header etc. sich einmal ausgeben lassen könnte zum debuggen :(

  • Wenn die zu lesenden Daten passen, könnte es beim senden an einer falschen Formatierung des json liegen.

    Hast du denn mal die Daten als Beispiel die du senden möchtest? Die Daten bitte geändert bereitstellen.

    Alternativ auch mal mit dem Tool "Postman" testen, ob du da senden kannst.

    Gruß gmmg

  • AutoIt
    ;~ $sData = '[{"deviceId":"an-id-with-seperators","firmwareId":"an-id-with-seperators"}]'
       $sData = '[{"deviceId":"' & $DeviceID & '","firmwareId":"' & $firmwareID & '"}]'

    Das obere wäre copy&paste aus der API Doku nachdem man den Test-Part hat laufen lassen.


    Und wie gesagt sämtliche Abfragen, die keine optionalen Daten benötigen, funktionieren einwandfrei.

    5 Mal editiert, zuletzt von Moombas (17. August 2022 um 11:36)

  • Teste doch mal über das Tool "Postman" (siehe Bild)

    URL anpassen, user und pass so wie in der API dokumentiert verwenden. Könnte auch username und password heißen. Dann bei Body auf Json stellen und die json Daten eintragen. Da musst du entsprechend probieren.

    Wenn hier die Json dann funktioniert, kannst du das in deinem Script umsetzen.

    Hier gibt es noch die Info zum Base64 decode/encode: https://www.toolsqa.com/postman/basic-…ion-in-postman/


  • Hi gmmg, mit Postman habe ich keine Erfahrungen, ich habe bisher über https://reqbin.com/req/c-d2nzjn3z/curl-post-body getestet bzw. die API Doku selber bietet im Prinzip das Gleiche (und noch mehr). Dort bekomme ich ja da skomplette "curl" Paket das ich dann entsprechend umarbeiten kann.

    Ich würde gerne sehen ob AutoIt bei dem erstellen der Header (komplett) bzw. der Daten irgendwas ändert und somit die Daten nicht mehr hin kommen. Also im Prinzip, das was man mit den oben genannten Schritten erzeugt hat, sich einmal anzeigen lassen, wie sie abgeschickt würden.

    Kann man das irgendwie erreichen?

  • Als kleines Schmankerl: Folgendes funktioniert:

    Kann mir jetzt jemand sagen, warum das eine geht und das andere nicht? -.-

  • Moombas: Das ist ja ählich meinem folgenden Script, welches ich in dem Post zu LimeSurvey API angegeben habe.

    In dem Bereich $oHTTP.Send($OptionalData) musst du deine Json absenden.

    Bei Limesurvey sieht die json als Beispiel wie folgt aus:

    $json_mail_participants = '{ "method": "modulname", "params": [ ' & $SessionKey & ', "' & $SurveyID & '" ], "id": 1 }' -> modulname + generierter Session Key + Umfrage ID

    $json_mail_participants = '{ "method": "mail_registered_participants", "params": [ ' & $SessionKey & ', "' & $SurveyID & '" ], "id": 1 }'

    Ein Beispiel für einen API Post gibt es wohl nicht?

    Gruß gmmg

  • Was meinst du mit Beispiel?

    Alles was ich bisher gepostet habe ist das was ich bereitstellen kann.

    Mich wundert halt, warum das per Objekt funktioniert aber nicht per winhttp.au3, irgendwas muss da ja anders/falsch laufen.

    Aber wenn da sonst auch keiner eine Idee hat, lasse ich diesen Teil per Objekt laufen, funktioniert ja jetzt.

    Warum aber der direkte DLL Aufruf (winhttp.au3) nicht funktioniert dabei würde mich dennoch interessieren, falls jemand eine Erklärung hat.

  • Ich habe das bisher so verstanden.

    Alles was du per LMC API "GET" auslesen willst klappt, du erhältst die entsprechenden Daten, hingegen das Schreiben von Daten per "POST" funktioniert nicht. Deshalb die Frage nach einem Beispiel, wie das eventuell von anderen gelöst wurde.

    Gruß gmmg

  • Achso, wie gesagt der "POST" API call aus Beitrag nr. 13 funktioniert ja witzigerweise, ich habe nun alles auf dieses umgestellt.

    Nur nicht das per winhttp.au3 (also direktem DLL Call) und das finde ich etwas verwirrend.