vba - 如何从 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 区域中传递(下面的屏幕截图)。
如何将其翻译成上面的代码?我已将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
我仍然得到与上周完全相同的结果。Postman 将使用 返回有效结果POST
,但GET
返回的正是我的代码得到的结果。
解决方案
推荐阅读
- swift - Swift-y 方法来解析整数前缀字符串,如 NSString
- bazel - 名称“package_name”未定义(您的意思是“PACKAGE_NAME”吗?)
- swift - 当我将值设置为 UserDefault 时 GoogleMap 崩溃 - UserDefaults.standard.set("km", forKey: APPLE_LANGUAGE_KEY)
- c# - 当应用程序启动并创建 DbContext 时,将新的 DbSet 添加到 DbContext
- python - seaborn distplot 每个图上不同的条形宽度
- python - 快速排序非常大的数据集问题
- django - 为每个模型实例调用一个方法
- java - Spring Boot Cloud Zuul - 重现 Zuul 异常转发错误
- php - 来自数组的学说 setParameters
- c++ - 类方法无法访问类变量