You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA调用R Plumber本地API时http.responseText返回缓存旧响应问题

VBA调用Plumber API时responseText返回缓存旧响应的原因

问题场景

本地用R的Plumber搭建API服务器后,通过Excel VBA调用出现以下情况:

  • 调用自定义的getHTTP(myurl)函数能获取实时响应
  • 直接使用MSXML2.XMLHTTP对象的responseText返回的是缓存的旧响应
  • 用Chrome浏览器访问同一URL能得到实时结果

相关VBA代码:

Public Function getHTTP(ByVal url As String) As String
  With CreateObject("MSXML2.ServerXMLHTTP.6.0")
    .Open "GET", url, False: .send
    getHTTP = StrConv(.responseBody, vbUnicode)
  End With
End Function


Sub APItest()

Dim myurl As String
Dim JSON As Object
Dim http As Object

myurl = "http://127.0.0.1:1234/my_local_api_server"

Debug.Print getHTTP(myurl) ' 实时输出最新响应

Set http = CreateObject("MSXML2.XMLHTTP")

http.Open "GET", myurl, False

http.send

Debug.Print (http.responseText) ' 输出缓存的旧响应

End Sub

原因分析

问题核心在于两个HTTP组件的缓存策略差异:

  • MSXML2.XMLHTTP是面向客户端的组件,默认会对GET请求启用本地缓存,只要请求URL未变化,就直接返回之前缓存的响应,不会重新向服务器发起请求。
  • MSXML2.ServerXMLHTTP.6.0(即getHTTP函数里用的对象)是面向服务端的组件,默认不启用本地缓存,每次请求都会直接和服务器交互获取最新数据。
  • Chrome浏览器在本地开发场景下,要么自动校验缓存有效性,要么打开开发者工具时默认禁用缓存,因此能拿到实时结果。

解决办法

如果要让MSXML2.XMLHTTP也获取实时响应,有两种简单可行的方式:

  1. 添加禁用缓存的请求头:在发送请求前设置请求头强制跳过缓存
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", myurl, False
' 添加禁用缓存的请求头
http.setRequestHeader "Cache-Control", "no-cache"
http.setRequestHeader "Pragma", "no-cache"
http.send
  1. 给URL添加随机参数:在URL末尾拼接随机值(比如当前时间戳),让每次请求的URL唯一,绕过缓存机制
myurl = "http://127.0.0.1:1234/my_local_api_server?rnd=" & Timer

内容的提问来源于stack exchange,提问作者user2165379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:37:36