如何使用 vba 测试 httpheader 的实例

Posted

技术标签:

【中文标题】如何使用 vba 测试 httpheader 的实例【英文标题】:How to test for instance of httpheader using vba 【发布时间】:2021-09-27 16:38:28 【问题描述】:

我正在使用 Excel VBA 发送一个 API 请求,该请求会根据返回的记录数返回一个可以分页的响应。当响应分页时,响应中将包含一个Link 标头,该标头提供firstnextpreviouslast 的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?

如何测试 Excel VBA 范围变量以引用整列..?

如何使用 QT WebEngine 发送 HTTPHeader?

httpHeaders

如何对 Excel VBA 代码进行单元测试

如何修复错误错误:未捕获(承诺):NullInjectorError:StaticInjectorError(AppModule)[HomeComponent - > HttpHeaders]