如何使用 vba 测试 httpheader 的实例
Posted
技术标签:
【中文标题】如何使用 vba 测试 httpheader 的实例【英文标题】:How to test for instance of httpheader using vba 【发布时间】:2021-09-27 16:38:28 【问题描述】:我正在使用 Excel VBA 发送一个 API 请求,该请求会根据返回的记录数返回一个可以分页的响应。当响应分页时,响应中将包含一个Link
标头,该标头提供first
、next
、previous
、last
的URI。
我遇到的问题是我正在尝试检测该标头以及标头所在的位置,我想解析该值并使用解析的值执行循环。但是,我尝试检测标头的代码返回错误。
Dim httpHeaders: httpHeaders = request.getAllResponseHeaders()
Debug.Print httpHeaders
If httpHeaders.Contains("Link") Then
Dim hdrLink as String
hdrLink = request.getResponseHeader("Link")
Debug.Print hdrLink
End If
我的代码在If
行出现“运行时错误'424':需要对象”错误。
我的httpHeaders
打印是:
Content-Type: application/json
Content-Length: 18378
ETag: ******
Status: ******
Access-Control-Allow-Origin: ******
Access-Control-Request-Method: ******
X-Version: ******
Link: <******&page=5>; rel="last", <******&page=2>; rel="next"
Total: 129
Per-Page: 30
X-Request-Id: ******
X-Runtime: ******
Strict-Transport-Security: ******
Expires: ******
注意:如果Total
等于或小于Per-Page
,则Link
将不存在。
谁能帮我理解为什么我的代码没有检测到Link
的存在以及我如何解析与链接关联的值以便找到最后一个页码?
提前致谢。
【问题讨论】:
【参考方案1】:VBA 中没有String.Contains
。 VB.NET中有。
您可以将httpHeaders
显式声明为String
。尽管您可以使用Instr()
来测试Link
子字符串是否在返回的字符串中anywhere,但尝试访问所需的标头似乎更容易,因为MSXML 库不会抱怨。您将得到一个 vbNullString
作为缺少的标头的值,可以快速测试。请参阅下面的示例:
Option Explicit
Public Sub PrintHeaders()
Dim http As MSXML2.XMLHTTP60 'required reference Microsoft XML v6,
Set http = New MSXML2.XMLHTTP60
With http
.Open "HEAD", "https://books.toscrape.com/", False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
Dim httpHeaders As String
httpHeaders = .getAllResponseHeaders()
Debug.Print httpHeaders
Dim hdrLink As String, contentType As String
hdrLink = .getResponseHeader("Link")
If hdrLink <> vbNullString Then Debug.Print "Found Link header: " & hdrLink
Debug.Print .getResponseHeader("content-type")
End With
End Sub
【讨论】:
以上是关于如何使用 vba 测试 httpheader 的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何将令牌设置为 Java 中获取请求的 HTTPHeader?
如何使用 QT WebEngine 发送 HTTPHeader?
如何修复错误错误:未捕获(承诺):NullInjectorError:StaticInjectorError(AppModule)[HomeComponent - > HttpHeaders]