我正在尝试编写一个 Excel 加载项,该加载项可以将数据从 Web 服务获取到 Excel 中。
要使用它,用户只需键入插件提供的函数名称。我发现了两篇在 VBA 中实现 HTTP 请求的文章:XMLHTTP和ServerXMLHTTP。
我很难使用它们。我不知道该用哪一个。XMLHTTP 和 ServerXMLHTTP 有什么区别?
我正在尝试编写一个 Excel 加载项,该加载项可以将数据从 Web 服务获取到 Excel 中。
要使用它,用户只需键入插件提供的函数名称。我发现了两篇在 VBA 中实现 HTTP 请求的文章:XMLHTTP和ServerXMLHTTP。
我很难使用它们。我不知道该用哪一个。XMLHTTP 和 ServerXMLHTTP 有什么区别?
达武兹,
Tim 和 Jay 都提供了出色的背景和简洁的评论。我将简单地添加一点并尝试提供一些上下文。
本质上,XMLHTTP 对象用于创建一个 XMLHttpRequest,用于从网站/网络服务器/网络服务中请求数据。有关详细信息,请参阅维基百科链接:http ://en.wikipedia.org/wiki/XMLHttpRequest
通常,XMLHTTP 通常用于作为客户端与服务器进行通信时 - 例如,当您使用应用程序向 Web 服务发出请求时。XMLHTTP 对象还用于各种以客户端为中心的传输方法,例如文件传输协议 (FTP)、url 缓存和其他有用的工具。简而言之,XMLHTTP 对象用于向某种服务器发出请求并请求客户端感兴趣的东西,无论是通过 FTP 连接访问服务器、来自存储库的一系列文件还是 Web 服务用于处理来自客户端的数据。
相比之下,ServerXMLHTTP 旨在用于服务器之间的通信、与应用程序(客户端)的通信以及处理来自客户端的请求。虽然 ServerXMLHTTP 对象保持状态处于活动状态——这意味着发送/接收到/从目的地的信息被保留用于当前连接中的未来数据事务——它也不主动支持某些 XMLHTTP 功能,例如“URL 缓存、自动代理服务器的发现、HTTP/1.1 分块、离线支持以及对 Gopher 和 FTP 协议的支持”,用于 ServerXMLHTTP 对象使用的 http 客户端堆栈。
从技术角度来看,XMLHTTP 对象使用 WinInet (Windows Internet Explorer) 来实现其功能,而 ServerXMLHTTP 对象使用客户端堆栈。WinInet dll 是 Windows 互联网协议管理的支柱,该 dll 用于处理 HTTP、HTTPS、FTP 和类似请求。
相比之下,当 ServerXMLHTTP 对象创建一个新的客户端 http 堆栈时 - 这本质上是一个 HTTP 客户端的单独“会话”。使用单独的会话意味着 ServerXMLHTTP 对象的多个实例可能在任何给定时间处于活动状态 - 取决于内存和套接字连接的可用性。
因此,简而言之——除了上面评论中的信息之外,XMLHTTP 对象通常用于请求信息并以某种方式使用它,通常作为客户端。同样有用但经常不同的使用,ServerXMLHTTP 对象可用于以相对有效的方式请求数据、发送数据或什至将接收到的数据传递给另一个应用程序到另一个应用程序。这通常用于需要实时响应的业务应用程序,或者用于在给定一系列请求的情况下向客户提供数据,这些请求可能包含内置条件 - 等等。
希望这能阐明两者之间的差异。在阅读有关使用特定 XMLHTTP 类型请求的 SO 问题/答案,以及对 MSDN 和其他提供有关 Internet/XMLHTTPRequest VB、VBA 和 Microsoft Office 特定材料的文档的站点进行更深入的研究时,还有更多内容可以找到。
让我知道这是否有帮助或者您有其他问题/想法,
~乔尔
我刚刚遇到了一个不同之处:当 Web 服务器 (IIS) 配置为仅允许 Windows 身份验证而不是匿名访问时,ServerXMLHTTP 调用会失败并出现身份验证错误,而 XMLHTTP 调用则不会。似乎 XMLHTTP 对象会在需要时自动处理发送 Windows 身份验证凭据。我怀疑将 NetworkCredentials 添加到 ServerXMLHTTP 对象应该是最好的解决方案,但我只能找到显式传递纯文本 uid/pwd 的基本身份验证(显然不可接受)。
ServerXMLHTTP 对象使用 winhttp,而 XMLHTTP 使用 wininet。
由于 wininet 解析身份验证和代理配置等问题,因此不会像使用 ServerXMLHTTP 时那样出现此类问题。然而,XMLHTTP 中有限的灵活性可能会迫使您承担使用 ServerXMLHTTP 的额外责任,因为必须协商服务器和目标端点身份验证机制,尽管 winhttp 中有一些方法可以帮助完成此任务。
当将更多基于客户端的 XMLHTTP 移植到更可配置的健壮的 ServerXMLHTTP 对象和类时,您可能想知道为什么这么久之前没有这样做。
甚至不要让我开始使用命运多舛且现已失效的 WPAD 支持。:)
真正帮助我的是那个。
定义对象后:
Dim objHTTP As Object
Set objHTTP = createObject("MSXML2.ServerXMLHTTP")
...
然后包括这两行:
' --- Disregard any Proxy Settings and go straight to the IP address
objHTTP.SetProxy 1