这是我第一次从我的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区域传递(下面的截图)。
如何将其转换为上述代码?我已将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
response_type
移到身体上,我想...... POST
和GET
,我仍然得到与上周完全相同的结果。邮递员将使用POST
返回有效结果,但GET
会返回我的代码所获得的内容。