HERBERS Excel-Forum - das Archiv

Thema: VBA HTTP Post - Probleme JSON Payload

VBA HTTP Post - Probleme JSON Payload
Pfanne
Moin,

ich steh auf dem Schlauch....
Ich möchte mit VBA einen HTTP Post senden.
Das klappt beim versenden OHNE Payload auch soweit auch ganz gut.



Private Function http_post(url As String, payload As String) As String
Dim req As MSXML2.ServerXMLHTTP60
Set req = New MSXML2.ServerXMLHTTP60

With req
.Open "POST", url, False
.setRequestHeader "Accept:", "application/json"
.setRequestHeader "Content-Type:", "application/json"
.setRequestHeader "X-Api-Key:", "---"
.send
http_post = .responseText
End With
End Function


Das HTTP-API kann zusätzlich auch noch über einen mit gesendeten JSON Payload weiter spezifiziert werden.
Der funktionierende PYTHON Code hierfür sieht so aus:



import requests

url = "https://api.bavest.co/v0/quote"

payload = { "isin": "US02079K3059" }

headers = {
"accept": "application/json",
"content-type": "application/json",
"x-api-key": "---"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)


Hierfür habe ich meinen Code wie folgt erweitert:



Private Function http_post(url As String, payload As String) As String
Dim req As MSXML2.ServerXMLHTTP60
Set req = New MSXML2.ServerXMLHTTP60

payload = "{ ""isin"": ""US02079K3059"" }"

With req
.Open "POST", url, False
.setRequestHeader "Accept:", "application/json"
.setRequestHeader "Content-Type:", "application/json"
.setRequestHeader "X-Api-Key:", "---"
.send payload
http_post = .responseText
End With
End Function


Das API meldet hier:
{"message": "Symbol does not exist.", "status": "ERROR"}

Mit diesem String:
payload = "{ 'isin': 'US02079K3059' }"

meldet das API:
{"message": "Internal server error"}

payload = "{ ""isin"": ""US02079K3059"" }"

scheint von dem API wohl akzeptiert zu werden, kann aber den Inhalt nicht vollständig interpretieren.
payload = "{ 'isin': 'US02079K3059' }"

scheint wohl nichtmal als gültiger JSON erkannt zu werden.

Was mache ich hier falsch?


Grüße
Pf@nne
AW: VBA HTTP Post - Probleme JSON Payload
Zwenn
Hallo Pfanne,

natürlich ungetestet. Aber laut Spezifikation wird ein JSON mit doppelten Anführungsstrichen aufgebaut. Die einfachen könnten Probleme machen. Zusätzlich werden HTTP-Header-Namen ohne Doppelpunkte geschrieben. Es kann gut sein, dass die requests Bibliothek in Python da stabiler aufgestellt ist und solche Fehler wegradiert, um die richtige Form an den WebServer zu übergeben. CaseSensitive ist HTTP übrigens nicht. Es ist also egal, ob Du die Header-Namen groß oder klein schreibst.

Du musst die Variable payload außerdem mit Dim payload as String deklarieren. Sonst ist es ein Variant. Damit kann der WebServer aber nix anfangen. Der nimmt nur Strings.

Es kann sein, dass die entsprechenden Anpassungen Dein Problem nicht lösen. Ist nur ein Schnellschuss meinerseits, basierend auf dem, was mir aufgefallen ist.
AW: Geht wohl jetzt hier weiter....
Zwenn
Danke für den Hinweis. Wenn dort niemand antwortet und er hier nicht mehr reinschaut, ist das sein Problem.
AW: Geht wohl jetzt hier weiter....
Pfanne
Moin,

Crossposting ist natürlich generell misst!
Ich denke aber, dass man nach einem Tag auch mal woanders nachfragen kann.

Es wäre natürlich klug gewesen den Crosslink hier auch reinzustellen, dann haben alle was davon.

Grüße
Pf@nne
AW: VBA HTTP Post - Probleme JSON Payload
Zwenn
Ah, hatte nur noch unten auf Deine payload-Beispiele geschaut zum Schluß. Du übergibst payload ja schon als String an die Funktion. Alles gut, vergiss den Punkt.