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