Excel 不关闭连接的VBA xmlhttprequest循环

Excel 不关闭连接的VBA xmlhttprequest循环,excel,vba,xmlhttprequest,Excel,Vba,Xmlhttprequest,我正在VBA中使用xmlhttp连接到API。问题是,我需要使用相同的API链接多次创建一个循环,唯一的区别是我发送了不同的JSON字符串 是否可以打开连接并只发送一次标头和身份验证,然后多次发送数据和接收响应 主要目的是提高代码的速度。 我知道我可以在循环内发送头文件并进行身份验证,但它运行速度太慢,无法满足我的需要 谢谢大家! APIKey = "xx" Session = "ss" API_Link = "zz" Dim xhr: Set xhr =

我正在VBA中使用xmlhttp连接到API。问题是,我需要使用相同的API链接多次创建一个循环,唯一的区别是我发送了不同的JSON字符串

是否可以打开连接并只发送一次标头和身份验证,然后多次发送数据和接收响应

主要目的是提高代码的速度。 我知道我可以在循环内发送头文件并进行身份验证,但它运行速度太慢,无法满足我的需要

谢谢大家!

    APIKey = "xx" 
    Session = "ss" 
    API_Link = "zz" 
    Dim xhr: Set xhr = CreateObject("MSXML2.XMLHTTP")
        With xhr
            .Open "POST", API_Link, False
            .setRequestHeader "X-Application", APIKey
            .setRequestHeader "Content-Type", "application/json"
            .setRequestHeader "Accept", "application/json"
            .setRequestHeader "X-Authentication", Session
        End With
        For Each cl In Rng
       'The below runs only the first time then it gives an error 
            xhr.send JSON_Query
            a = xhr.ResponseText 
        next cl

不,我不相信您可以使用xmlhttp(很高兴被证明是错误的)来保存头。您最好在循环外创建xmlhttp对象,并在变量中保存某些值以供重用。您仍然需要提供.Get、.Send的事务和标题

在保留身份验证方面,我认为您可以登录一次,然后在后续请求中传递cookies(JSESSION),具体取决于过期时间

在其他语言中,例如python,您可以实现。这允许您跨请求持久化某些参数

HTTP持久连接,也称为HTTP保持活动状态,或HTTP 连接重用,是使用单个TCP连接发送数据的想法 并接收多个HTTP请求/响应,而不是打开 每个请求/响应对的新连接。新的 HTTP/2协议使用了相同的思想,并进一步允许 多个并发请求/响应在单个服务器上多路传输 连接

在python中:

会话还可用于向请求提供默认数据 方法。这是通过向会话上的属性提供数据来实现的 反对

因此,您可以创建
会话
对象,该对象的方法与发出请求的API库相同(就像xmlhttp一样),然后更新保存的头文件

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('https://httpbin.org/headers', headers={'x-test2': 'true'})
A标识会话期间来自同一浏览器的请求。所有servlet都可以共享同一个会话。JSESSIONID由服务器生成,可以通过cookie传递给客户端 斯里尼瓦斯巴拉萨尼

优点:

  • 减少后续请求的延迟(无握手)
  • 由于新连接和TLS握手更少,因此减少了CPU使用和往返
  • 启用请求和响应的HTTP管道
  • 减少网络拥塞(减少TCP连接)
  • 可以报告错误,而无需关闭TCP连接
  • 根据RFC 7230第6.4节,“客户应限制 它维护到给定网络的同时打开的连接数 服务器”。HTTP/1.1规范的早期版本 具体最大值,但用RFC 7230的话来说,“这是发现的 对于许多应用来说是不切实际的……相反,要保守 打开多个连接时”。这些指导方针旨在 提高HTTP响应时间并避免拥塞。如果HTTP流水线 如果正确实施,则无法获得性能效益 来自其他连接,而其他连接可能导致 拥堵问题

    缺点:

    如果客户端在所有数据丢失时未关闭连接 已收到需求,保持连接所需的资源 服务器上的open将对其他客户端不可用。多少钱? 这会影响服务器的可用性以及资源的可用时间 不可用取决于服务器的体系结构和配置

    因此,仍然使用python示例,我们通常使用
    with
    语句,该语句在执行嵌套在其中的代码块后自动确保使用exit方法关闭连接

    我认为WinHttp有很多功能。附加会话信息。虽然有很多指向字符串的指针

    lpszHeaders

    指向包含附加头的字符串的指针 根据请求。此参数可以是WINHTTP\u NO\u附加\u头,如果 没有附加的头

    这是我从未尝试过的

    尽管你可以通过COM找到解决方案