VBA xmlhttprequest循环而不关闭连接

时间:2019-06-08 04:34:43

标签: vba excel-vba xmlhttprequest

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

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

主要目的是提高代码速度。 我知道我可以在循环内发送标头并进行身份验证,但是对于我的需求而言,它运行太慢。

谢谢!

(,)

1 个答案:

答案 0 :(得分:0)

不,我不认为您可以使用xmlhttp(很高兴被证明是错误的)来保留标题。最好的办法是在循环外创建xmlhttp对象,并将某些值保留在变量中以供重复使用。您仍然必须提供.Get,.Send和标头的事务。

就保留身份验证而言,我认为您可以登录一次,然后使用MSXML2.ServerXMLHTTP根据后续期限(在有效期内)在后续请求中传递cookie(JSESSION)。

其他语言,例如python,您可以执行http sessions。这使您可以在请求中保留某些参数。

HTTP Persistent Connection

  

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

在python中,for example

  

会话也可以用于向请求提供默认数据   方法。这是通过向会话的属性提供数据来完成的   对象。

因此,您创建Session对象,该对象具有与发​​出请求的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'})

session标识在对话期间源自同一浏览器的请求。所有servlet可以共享同一会话。 JSESSIONID由服务器生成,可以通过cookie传递给客户端 Srinivas Balasani

优势:

  
      
  1. 减少了后续请求中的延迟(无握手)。
  2.   
  3. 由于更少的新连接和TLS握手,减少了CPU使用率和往返次数。
  4.   
  5. 启用HTTP管道的请求和响应。
  6.   
  7. 减少了网络拥塞(更少的TCP连接)。
  8.   
  9. 可以在不关闭TCP连接的情况下报告错误。
  10.   
     

根据RFC 7230第6.4节,“客户端应限制   它与给定保持的同时打开的连接数   服务器”。HTTP/ 1.1规范的先前版本已声明   特定最大值,但用RFC 7230的话来说“   在许多应用中不切实际...反而比较保守   当打开多个连接时”。这些准则旨在   缩短HTTP响应时间并避免拥塞。如果HTTP流水线   正确实施,将不会获得性能优势   来自其他连接,而其他连接可能会导致   拥塞问题

缺点:

  

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

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

我认为WinHttp具有setting cookies的功能。其他会话信息here。尽管有mention个指向字符串的指针

lpszHeaders

  

指向包含附加标头的字符串的指针   的要求。如果此参数可以是WINHTTP_NO_ADDITIONAL_HEADERS   没有要附加的其他标题。

这不是我尝试过的事情。