首页 > 解决方案 > 如何从 VBA 中的 RESTful API 获得响应?

问题描述

这是我第一次从我的 VBA 代码中调用 REST API。

API 文档位于此处(PDF 下载)。我正在尝试使用 PDF 第 8 页上的示例,只是为了确保一切正常,除了不提供location参数,因为我还不知道他们为我们分配了哪些数字。文档的第 55 页指定关闭此参数将返回所有位置,这正是我目前所追求的。

我把这段代码放在一起,似乎让我建立了联系,但我似乎没有得到文档承诺的结果。

Public Sub RESTtest()

  Dim URL As String
  URL = "https://ws.appointment-plus.com"

  Dim locationsURL As String
  locationsURL = "/Locations/GetLocations"

  Dim siteID As String
  siteID = "myID"
  Dim APIKey As String
  APIKey = "myKey"
  Dim restRequest As WinHttp.WinHttpRequest
  Set restRequest = New WinHttp.WinHttpRequest
  Dim restResult As String

  With restRequest
    .Open "POST", URL & locationsURL, True
'    .Open "GET", URL & locationsURL, True
    .setRequestHeader "Authorization", "Basic " & siteID & ":" & APIKey
    .setRequestHeader "response_type", "xml"
    .setRequestHeader "Accept-Encoding", "application/xml"
    .Send
    .waitForResponse
    Debug.Print ".ResponseText: " & .ResponseText
    Debug.Print ".Status: " & .Status
    Debug.Print ".StatusText: " & .StatusText
    Debug.Print ".ResponseBody: " & .ResponseBody
  End With

End Sub

GET了我这个输出:

.ResponseText: <p>Welcome to the Appointment-Plus RESTful Web Service/API.</p><p><strong>ws.appointment-plus.com</strong></p>
.Status: 200
.StatusText: OK
.ResponseBody: ???????????????????????????????????????????????????????

虽然这POST给了我这个看起来不太有用的输出:

.ResponseText: 
.Status: 200
.StatusText: OK
.ResponseBody: 

在任何一种情况下,我都会得到一个似乎是 200 的状态OK,所以呼叫似乎工作得很好。

通过WinHttp.WinHttpRequest查看,我发现有一个.ResponseStream似乎很可能获得响应的完整 XML 的候选者,但是,它返回一个 IStream,我还没有弄清楚如何在 VBA 中处理它。

获取 API 调用的完整结果的正确属性是否.ResponseStream正确?如果是,我需要在项目中包含什么以使我能够处理它?

更新

根据我从供应商那里收到的反馈:

我建议他使用 Basic Auth 而不是 Strong 并确保 API Key 和 SiteID 在请求/标头中发送。Postman 做得很好。我还建议 POST 方法和参数应该在 Postman 的 Body 区域中传递(下面的屏幕截图)。

我已经通过 Postman 使用以下设置进行了这项工作: 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

如何将其翻译成上面的代码?我已将With块修改为如下所示:

  With restRequest
'    .Open "POST", URL & method, True
    .Open "GET", URL & method, True
    .setRequestHeader "Authorization", "Basic " & siteID & ":" & APIKey
'    .setRequestHeader "response_type", "xml"
'    .setRequestHeader "Accept-Encoding", "gzip, deflate, br"
    .Option(WinHttpRequestOption_EnableRedirects) = False
    .Send "{""response_type"":""xml""}"
    .waitForResponse
    Debug.Print ".ResponseText: " & .ResponseText
    Debug.Print ".Status: " & .Status
    Debug.Print ".StatusText: " & .StatusText
    Debug.Print ".ResponseBody: " & .ResponseBody
  End With

标签: vbarest

解决方案


推荐阅读