Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

API Post funktioniert nicht per VBA

Forumthread: API Post funktioniert nicht per VBA

API Post funktioniert nicht per VBA
25.07.2022 14:55:07
Florian
Moinsen,
ich habe mir eine Anbindung an eine API gebaut, die leider nicht funktioniert. Der GET klappt einwandfrei, aber beim POST gibt es Probleme. Die API wirft diesen Fehler zurück:

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: The GET method is not supported for this route.
Das ist mein Code. Anscheinend macht Excel kein POST sonder ein GET daraus.

Sub POST()
Dim objRequest As Object
Dim strUrl As String
Dim blnAsync As Boolean
Dim strResponse As String
Set objRequest = CreateObject("MSXML2.XMLHTTP")
strUrl = "https://api.meinedomain.de/api/v1/post-test/?name=testname"
blnAsync = True
With objRequest
.Open "POST", strUrl, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.Send
'spin wheels whilst waiting for response
While objRequest.readyState  4
DoEvents
Wend
strResponse = .ResponseText
End With
Debug.Print strResponse
End Sub
Kann jemand helfen?
Danke Euch!
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: API Post funktioniert nicht per VBA
26.07.2022 13:22:50
Tobias
Hallo Florian,
Bei JSON hört es bei mir auf allerdings kannst du über deine Url mit ?name=testname kein JSON übergeben wie du als requestheader festlegst. Das müsste meiner Meinung nach als JSON-String als Parameter bei dem Sendbefehlt mitgegeben werden. Alternativ dann halt den RequestHeader entsprechend anpassen
Als ich mal mit API´s experimentiert habe hatte ich noch die Software Postman verwendet um die API-Calls zu testen. Eventuell liegt ja da auch irgendwo der Fehler. Frage lass ich mal offen weil ich nicht sicher bin ob das wirklich die Lösung bringt!
Schöne Grüße
Tobias
Anzeige
AW: API Post funktioniert nicht per VBA
26.07.2022 13:32:18
ChrisL
Hi Tobias
Zufall, dass ich gleich nach dir geantwortet habe. Wollte nicht bewusst reinfunken...
cu
Chris
AW: API Post funktioniert nicht per VBA
26.07.2022 13:30:28
ChrisL
Hi Florian
Bei GET stehen die Parameter (name=xy) direkt im URL. Bei POST sind die Argumente separat zu übergeben, nicht im URL.
Wenn ich mir die beiden Links ansehe, müssten die Parameter in der Zeile ".Send" übergeben werden.
https://codingislove.com/http-requests-excel-vba/ (Simple POST request to send formdata)
https://stackoverflow.com/questions/18111884/pass-parameters-in-vba-http-post-request
ungetestet:

Sub POST()
Dim objRequest As Object
Dim strUrl As String
Dim blnAsync As Boolean
Dim strResponse As String
Set objRequest = CreateObject("MSXML2.XMLHTTP")
strUrl = "https://api.meinedomain.de/api/v1/post-test/?"
blnAsync = True
With objRequest
.Open "POST", strUrl, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.Send "name=testname"
'spin wheels whilst waiting for response
While objRequest.readyState  4
DoEvents
Wend
strResponse = .ResponseText
End With
Debug.Print strResponse
End Sub
cu
Chris
Anzeige
AW: API Post funktioniert nicht per VBA
26.07.2022 17:22:42
Florian
Fehler gefunden.
In der URL war der Schrägtisch hinter post-test zu viel. Dadurch wurde dann wohl irgendwie ein GET erkannt. Nun läuft alles. Danke euch!! :)
;
Anzeige

Infobox / Tutorial

API Post mit VBA erfolgreich umsetzen


Schritt-für-Schritt-Anleitung

Um eine API mit einem POST-Request in Excel VBA anzusprechen, folge diesen Schritten:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineArbeitsmappe)", wähle "Einfügen" und dann "Modul".

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Sub POST()
        Dim objRequest As Object
        Dim strUrl As String
        Dim blnAsync As Boolean
        Dim strResponse As String
        Set objRequest = CreateObject("MSXML2.XMLHTTP")
        strUrl = "https://api.meinedomain.de/api/v1/post-test/"
        blnAsync = True
        With objRequest
            .Open "POST", strUrl, blnAsync
            .SetRequestHeader "Content-Type", "application/json"
            .Send "{""name"":""testname""}" ' JSON-Parameter hier einfügen
            'spin wheels whilst waiting for response
            While .readyState <> 4
                DoEvents
            Wend
            strResponse = .ResponseText
        End With
        Debug.Print strResponse
    End Sub
  4. Code anpassen: Stelle sicher, dass die URL und die Parameter korrekt sind. In diesem Beispiel wird ein JSON-String als Parameter gesendet.

  5. Makro ausführen: Schließe den VBA-Editor und drücke ALT + F8, um das Makro auszuführen.


Häufige Fehler und Lösungen

  • Fehler: MethodNotAllowedHttpException: Dieser Fehler tritt auf, wenn die API keinen POST-Request annehmen kann. Überprüfe, ob die URL korrekt ist und ob du die Parameter richtig übergibst.
  • Fehler bei JSON-Formatierung: Achte darauf, dass die JSON-Daten korrekt formatiert sind. Beispielsweise sollte ein durch Kommas getrenntes Paar wie { "name": "testname" } anstelle von name=testname übergeben werden.
  • GET-Request statt POST: Stelle sicher, dass du den richtigen HTTP-Methoden-Typ verwendest (.Open "POST", strUrl).

Alternative Methoden

Wenn du Schwierigkeiten mit dem MSXML2.XMLHTTP-Objekt hast, kannst du auch andere Optionen in Betracht ziehen:

  • WinHttp.WinHttpRequest: Ein weiteres Objekt, das oft für HTTP-Anfragen in VBA verwendet wird:

    Dim objRequest As Object
    Set objRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
  • Postman: Verwende Postman, um deine API-Requests zu testen, bevor du sie in VBA umsetzt. So kannst du sicherstellen, dass die API korrekt funktioniert.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um einen POST-Request mit JSON-Daten zu senden:

Sub ExamplePost()
    Dim objRequest As Object
    Set objRequest = CreateObject("MSXML2.XMLHTTP")
    With objRequest
        .Open "POST", "https://api.meinedomain.de/api/v1/post-test/", False
        .setRequestHeader "Content-Type", "application/json"
        .Send "{""name"":""Beispielname""}"
        Debug.Print .ResponseText
    End With
End Sub

In diesem Beispiel wird ein einfacher POST-Request an die angegebene API gesendet, und das Ergebnis wird im Debug-Fenster angezeigt.


Tipps für Profis

  • Verwendung von .setRequestHeader: Nutze diese Methode, um Header für deinen HTTP-Request anzupassen. Dies kann wichtig sein, wenn du mit APIs arbeitest, die Authentifizierung benötigen.

  • Asynchrone Requests: Setze blnAsync auf False, wenn du sicherstellen möchtest, dass das Skript auf die Antwort wartet, bevor es fortfährt.

  • Fehlerprotokollierung: Füge Error-Handling hinzu, um Probleme während des Requests zu diagnostizieren:

    On Error GoTo ErrorHandler
    ' ... dein Code hier ...
    Exit Sub
    ErrorHandler:
        Debug.Print "Fehler: " & Err.Description

FAQ: Häufige Fragen

1. Wie kann ich JSON-Daten in meinem POST-Request senden?
Du musst die Daten als JSON-String im .Send-Befehl übergeben, z.B. .Send "{""name"":""testname""}".

2. Was mache ich, wenn die API eine Authentifizierung benötigt?
Füge die notwendigen Header in deinem Code hinzu, z.B. .setRequestHeader "Authorization", "Bearer dein_token".

3. Wie kann ich sicherstellen, dass mein POST-Request erfolgreich war?
Überprüfe die Statuscode-Antwort mit .Status nach dem Senden des Requests. Ein Statuscode von 200 bedeutet, dass die Anfrage erfolgreich war.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige