CURL 等效于使用 VBA 的 POST JSON 数据

Posted

技术标签:

【中文标题】CURL 等效于使用 VBA 的 POST JSON 数据【英文标题】:CURL Equivalent to POST JSON data using VBA 【发布时间】:2017-05-20 13:15:35 【问题描述】:

我知道这与之前提出的一些问题类似,但有些问题仍然不适合我。怎么可以下面的命令:

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

在 VBA 中复制?

额外信息:

这与名为 WaxLRS(SaltBox 提供)的托管 TIN CAN (xAPI) 学习记录存储有关。上面的例子来自这里: http://support.saltbox.com/support/solutions/articles/1000083945-quick

我有一个帐户(免费的 tinkerers 帐户,无需 CC 即可设置)并生成了我认为所需的用户名和密码组合。凭据称为“标识符”和“密码”,并出现在标题下:基本身份验证凭据

无论我做什么,我都会收到一条错误消息:

<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>

我相信该示例期望从文件中获取 JSON 有效负载,但我将其加载到字符串中。我不希望这会导致问题,我已经将我的字符串与使用 NP++ Compare 提供的示例进行了比较,并且它匹配。

到目前为止我的代码是:

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

有帮助的问题/答案:

Send a JSON string to a RESTful WS from Classic ASP https://***.com/a/17063741/3451115 How to POST JSON Data via HTTP API using VBScript?

但是,我仍然不知道如何在 VBA 中复制 CURL 语句

【问题讨论】:

检查this answer中的基本授权。 ***.com/questions/17063550/… SetCredentials 需要纯文本 User 和 PW 值,它将处理 Base64 编码。 谢谢大家...我会看看建议并回复:) @omegastripes - 谢谢,这让我通过了验证错误(在那里提高了你的答案)。现在我有一个400 Bad Request 错误。我会再调查一下... 【参考方案1】:

尝试进行基本授权,如下例所示:

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

【讨论】:

谢谢!工作了一次,拯救了我的理智(还剩下什么)。干杯,

以上是关于CURL 等效于使用 VBA 的 POST JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell 的 Invoke-RestMethod 等效于 curl -u(基本身份验证)

在 cURL 库中寻找等效的语法

Swift:cUrl 等效 Alamofire 请求

是否有与 Perl 的 WWW::Mechanize 等效的 PHP?

如何在VBA HTTP API中使用-x进行POST?

JAVA 中的 cURL 等效项