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也获取实时响应,有两种简单可行的方式:
- 添加禁用缓存的请求头:在发送请求前设置请求头强制跳过缓存
Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", myurl, False ' 添加禁用缓存的请求头 http.setRequestHeader "Cache-Control", "no-cache" http.setRequestHeader "Pragma", "no-cache" http.send
- 给URL添加随机参数:在URL末尾拼接随机值(比如当前时间戳),让每次请求的URL唯一,绕过缓存机制
myurl = "http://127.0.0.1:1234/my_local_api_server?rnd=" & Timer
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

