2017-05-20 4 views
1

Ich weiß, dass dies ähnlich wie einige zuvor gestellte Fragen ist, aber etwas funktioniert immer noch nicht für mich. Wie kann der folgende Befehl:CURL Äquivalent zu POST JSON-Daten mit VBA

curl -X POST --data @statements.json -H "Content-Type: application/json" --user username:password -H "x-experience-api-version: 1.0.0" https://MYLRS.waxlrs.com/TCAPI/statements 

in VBA repliziert werden?

Zusätzliche Informationen:

Dies entspricht einem Hosted TIN bezieht CAN (XAPI) Lern ​​Record Store WaxLRS genannt (von saltbox). Das obige Beispiel stammt von hier: http://support.saltbox.com/support/solutions/articles/1000083945-quick

Ich habe ein Konto (kostenlos tinkerers Konto, keine CC-Setup erforderlich) und generiert habe, was ich glaube, dass die erforderlichen Benutzername & Passwort Kombination. Die Anmeldeinformationen werden als "Kennung" & "Kennwort" bezeichnet und erscheinen unter der folgenden Überschrift: Grundlegende Authentifizierungsinformationen.

Egal was ich tue, erhalte ich eine Fehlermeldung:

<html> 
    <head><title>Unauthorized</title></head> 
    <body> 
    <h1>Unauthorized</h1> 
    <p>This server could not verify that you are authorized to 
access the document you requested. Either you supplied the 
wrong credentials (e.g., bad password), or your browser 
does not understand how to supply the credentials required. 

<br/> 
<!-- --></p> 
    <hr noshade> 
    <div align="right">WSGI Server</div> 
    </body> 
</html> 

Ich glaube, dass das Beispiel die JSON Nutzlast erwartet aus einer Datei zu erhalten, aber ich es in einen String bin Laden. Ich erwarte nicht, dass dies zu dem Problem beiträgt, ich habe meine Zeichenfolge mit dem Beispiel verglichen, das mit NP ++ Compare bereitgestellt wurde, und es stimmt überein.

Mein Code so weit ist:

url = "https://xxxxxxx.waxlrs.com/TCAPI/statements" 
Set pXmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1") 'MSXML2.XMLHTTP") 
pXmlHttp.Open "POST", url, False 
pXmlHttp.setRequestHeader "Content-Type", "application/json" 
'pXmlHttp.setRequestHeader "Authorization", "Basic xxxxxxt8wfB6JYerYCz:xxxxxx1FOd29J1s6G2" 
pXmlHttp.SetCredentials "xxxxxxt8wfB6JYerYCz", "xxxxxx1FOd29J1s6G2", 0 
pXmlHttp.setRequestHeader "x-experience-api-version", "1.0.0" 
pXmlHttp.send (stringJSON) 
Set pHtmlObj = CreateObject("htmlfile") 
pHtmlObj.body.innerHTML = pXmlHttp.responseText 
apiWaxLRS = pXmlHttp.responseText 

Fragen/Antworten, die dazu beigetragen:

Aber bin ich ratlos nach wie vor, wie die CURL-Anweisung in VBA zu replizieren

+1

prüfen Grund Genehmigung in [dieser Antwort] (http://stackoverflow.com/a/39862888/2165759). – omegastripes

+0

http://stackoverflow.com/questions/17063550/equivalent-curl-in-vba?noredirect=1&lq=1 –

+0

'SetCredentials' erwartet die reinen Text Benutzer und PW Werte, es wird Base64 Kodierung behandeln. – Bob77

Antwort

1

Try Grund Ermächtigung Gebrauch zu machen, wie im folgenden Beispiel gezeigt:

Sub Test() 

    sUrl = "https://xxxxxxx.waxlrs.com/TCAPI/statements" 
    sUsername = "*******************" 
    sPassword = "******************" 
    sAuth = TextBase64Encode(sUsername & ":" & sPassword, "us-ascii") 
    With CreateObject("WinHttp.WinHttpRequest.5.1") 
     .Open "POST", sUrl, False 
     .setRequestHeader "Content-Type", "application/json" 
     .setRequestHeader "Authorization", "Basic " & sAuth 
     .setRequestHeader "x-experience-api-version", "1.0.0" 
     .send (stringJSON) 
     apiWaxLRS = .responseText 
    End With 

End Sub 

Function TextBase64Encode(sText, sCharset) 

    Dim aBinary 

    With CreateObject("ADODB.Stream") 
     .Type = 2 ' adTypeText 
     .Open 
     .Charset = sCharset 
     .WriteText sText 
     .Position = 0 
     .Type = 1 ' adTypeBinary 
     aBinary = .Read 
     .Close 
    End With 
    With CreateObject("Microsoft.XMLDOM").CreateElement("objNode") 
     .DataType = "bin.base64" 
     .NodeTypedValue = aBinary 
     TextBase64Encode = Replace(Replace(.Text, vbCr, ""), vbLf, "") 
    End With 

End Function 
+0

Vielen Dank! Arbeitete ein Vergnügen, rettete mir meine Vernunft (was ist davon übrig). Prost, – SlowLearner

+0

Nicht notwendig, wie ich bereits oben hingewiesen habe. – Bob77