如何从VBA中的RESTful API获取响应?

时间:2018-05-24 12:36:04

标签: vba rest

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

API文档位于here (PDF download)。我正在尝试使用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中处理。

.ResponseStream是获取API调用的完整结果的正确属性吗?如果是,我需要在项目中包含哪些内容才能让我处理它?<​​/ p>

更新

根据我从供应商处收到的反馈意见:

  

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

我通过这些设置通过Postman使用了这个: enter image description here enter image description here enter image description here

如何将其转换为上述代码?我已将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
  • 我能说的最好,我从一开始就使用Basic auth,而不是Strong,但是,我是新手。
  • 我将response_type移到身体上,我想......
  • 我再次尝试POSTGET,我仍然得到与上周完全相同的结果。邮递员将使用POST返回有效结果,但GET会返回我的代码所获得的内容。

0 个答案:

没有答案