MSXML2.XMLHTTP

客户端程序编写免不了经常接触XMLHttpRequest对象。
微软的XHR实现的progid又是一串一串的。 烦人。抽一个中午时间,找了找资料,整理记录如下:

"Microsoft.XMLHTTP"
最早的XHR实现。微软官网上说这是MSXML 2.x系列版本的progid。
2.x 系列progid是不带版本号的。看起来简单清楚。
引用:
MSXML 2.6 was shipped with SQL Server 2000 and MDAC 2.6 and is provided in Windows or other service pack updates provided by Microsoft.

MSXML 2.6 installs in replace mode only.


"MSXML2.XMLHTTP"
MSXML 3.0 的progid,
"MSXML2.XMLHTTP.3.0"
也是MSXML 3.0 的,应该等价于MSXML2.XMLHTTP;这时,可能是感觉到那种不带版本号的progid,在升级后造成的兼容性问题,以后的更新版本的progid都可以带上版本好吗。
引用:
MSXML 3.0 is provided as a required component with a number of Microsoft products, such as Microsoft Visual Studio and Microsoft Office. It is also a system component for current versions of Microsoft Windows.

MSXML 3.0 SP2 or later installs in replace mode only. (Note: you do not need to run xmlinst.exe utility when updating to this version of MSXML 3.0)


"Msxml2.XMLHTTP.4.0"
此后的版本,都带上了版本号码,可能是为了应对程序员懒散的习惯(不喜欢带那个版本号),不提供以前那种无版本后缀的progid了。
引用:
MSXML 4.0 is a separate download that was released by Microsoft in October 2001. The latest or current service pack release of MSXML 4.0 is available through the Microsoft Web site. MSXML 4.0 must be installed separately and is not currently included with other Microsoft products.

MSXML 4.0 installs side-by-side with earlier versions of MSXML without affecting any existing functionality.


“Msxml2.XMLHTTP.5.0"
引用:
MSXML 5.0 for Microsoft Office Applications is only available with current versions of Microsoft Office.

MSXML 5.0 for Microsoft Office Applications installs side-by-side with earlier versions of MSXML without affecting any existing functionality.


"Msxml2.XMLHTTP.6.0"
引用:
MSXML 6.0 is a separate download that was released by Microsoft in November 2005. The latest or current service pack release of MSXML 6.0 is available through the Microsoft Web site. MSXML 6.0 must be installed separately. It is included with SQL Server 2005.

MSXML 6.0 installs side-by-side with earlier versions of MSXML without affecting any existing functionality.


这么多的实现,哪我们如何探测呢?一般来说,我们应该尽量采用更新的更常用的版本。
我的选择是(摘自JSI内核源码)::

js 代码

if(this.ActiveXObject && !this.XMLHttpRequest ){
var xmlHttpRequstActiveIds = [
"Microsoft.XMLHTTP"//IE5的,最早的XHR实现
,"MSXML2.XMLHTTP"
//,"MSXML2.XMLHTTP.3.0"//应该等价于MSXML2.XMLHTTP
//,"Msxml2.XMLHTTP.4.0"
,"Msxml2.XMLHTTP.5.0"
//,"Msxml2.XMLHTTP.6.0"
];
var xmlHttpRequstActiveId
this.XMLHttpRequest = function(){
if(xmlHttpRequstActiveId){
return new ActiveXObject(xmlHttpRequstActiveId);
}else{
var i=xmlHttpRequstActiveIds.length;
while(i --){
try{
var impl = new ActiveXObject(xmlHttpRequstActiveId = xmlHttpRequstActiveIds[i]);
xmlHttpRequstActiveIds = null;
return impl;
}catch (e){}
}
}
};
}


var xmlrequest;
function createXMLHttpRequest()
{
//对于Firefox和Opera等浏览器
if (window.XMLHttpRequest) {
xmlrequest = new XMLHttpRequest();
}
else //对于IE浏览器
{
//将IE的不同XMLHttp实现声明数组
var MSXML=['Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
//依次对每个XMLHTTP实现创建XMLHttpRequest对象
for(var i=0;i<MSXML.length;i++)
{
try
{
xmlrequest=new ActiveXObject(MSXML[i]);
break;
}
catch (ex) {
}
}
}
}
<think>嗯,用户问的是关于VBA中的MSXML2.XMLHTTP,这应该是一个用来发送HTTP请求的对象。首先,我需要回忆一下这个对象的基本用法和常见场景。用户可能想用VBA来自动化网页数据获取或者与API交互,对吧? 首先,得确认用户的需求是什么。他们可能是想了解如何用VBA发送GET或POST请求,或者处理返回的数据。可能他们遇到了什么问题,比如如何设置请求头,处理超时,或者处理异步请求?需要覆盖这些基础内容。 接下来,我应该分步骤介绍,先说明如何引用库,然后创建对象,发送请求,处理响应。可能还需要提到常见的属性和方法,比如Open、Send、setRequestHeader、responseText等。此外,错误处理也很重要,比如处理超时或网络错误,可能需要On Error语句。 用户可能对同步和异步请求的区别不太清楚,需要解释一下两者的不同,以及何时使用哪种方式。例如,同步会阻塞代码执行直到收到响应,而异步则需要事件处理。 另外,要注意安全性问题,比如服务器证书验证,这在VBA中可能需要额外设置,比如忽略SSL错误,这点可能需要提到,但也要提醒用户注意安全风险。 可能还需要给出示例代码,比如发送GET请求获取网页内容,或者POST表单数据到服务器。示例代码应该简洁,并且有注释说明每一步的作用。 用户可能在使用过程中遇到常见问题,比如引用库的问题,如何添加MSXML2参考,或者处理返回的JSON数据。可能需要提到如何解析JSON,虽然这可能需要额外的库或者函数。 最后,总结一下优缺点,比如MSXML2.XMLHTTP的轻量级和兼容性,以及可能的限制,比如不支持现代的身份验证方式,或者性能方面的考虑。 需要检查是否有遗漏的部分,比如是否应该比较其他HTTP库,比如WinHttp.WinHttpRequest.5.1,或者讨论XMLHTTPServerXMLHTTP的区别?可能用户没有提到,但简要说明可以帮助他们更好地选择。 确保语言通俗易懂,避免太多技术术语,但也要准确。结构要清晰,分步骤或分点,方便用户一步步操作。如果有潜在的问题或注意事项,比如异步处理需要等待,或者内存泄漏的问题,也需要提及。 总之,回答需要全面覆盖使用MSXML2.XMLHTTP的各个方面,从基础到进阶,常见问题到解决方案,确保用户能够理解并应用。</think>--- ### **VBA中的`MSXML2.XMLHTTP`对象简介** `MSXML2.XMLHTTP`是VBA中用于发送HTTP请求的核心组件,常用于实现以下功能: - 从网页或API获取数据(GET/POST请求) - 提交表单数据 - 自动化与Web服务的交互 其底层基于Microsoft XML库,支持同步和异步通信模式。 --- ### **基础使用步骤** #### **1. 引用库文件** 在VBA编辑器中,需确保已引用`Microsoft XML`库: - 打开VBA编辑器 → 工具 → 引用 → 勾选`Microsoft XML, v6.0`(版本号可能不同)。 #### **2. 创建对象并发送请求** ```vba Sub SendHTTPRequest() Dim objHTTP As Object Set objHTTP = CreateObject("MSXML2.XMLHTTP") ' 创建对象 ' 定义目标URL(示例为GET请求) Dim url As String url = "https://api.example.com/data" ' 发送异步请求(True)或同步请求(False) objHTTP.Open "GET", url, False objHTTP.Send ' 处理响应 If objHTTP.Status = 200 Then Debug.Print objHTTP.responseText ' 输出返回内容 Else Debug.Print "请求失败,状态码:" & objHTTP.Status End If Set objHTTP = Nothing ' 释放对象 End Sub ``` --- ### **核心方法与属性** | **方法/属性** | **说明** | |----------------------|-------------------------------------------------------------------------| | `.Open(Method, URL, Async)` | 初始化请求。`Method`为`GET`/`POST`;`Async`为`True`(异步)或`False`(同步)。 | | `.Send([RequestBody])` | 发送请求。POST请求时传入请求体(如JSON或表单数据)。 | | `.setRequestHeader(Header, Value)` | 设置HTTP请求头(如`Content-Type`或`Authorization`)。 | | `.responseText` | 获取响应内容(文本格式)。 | | `.responseXML` | 获取响应内容(XML格式,需服务器返回XML)。 | | `.Status` | 获取HTTP状态码(如200表示成功,404表示未找到)。 | --- ### **高级应用示例** #### **示例1:发送POST请求(JSON数据)** ```vba Sub SendPostRequest() Dim objHTTP As Object Set objHTTP = CreateObject("MSXML2.XMLHTTP") Dim url As String url = "https://api.example.com/submit" ' 定义JSON数据 Dim jsonData As String jsonData = "{""name"": ""John"", ""age"": 30}" ' 发送POST请求 With objHTTP .Open "POST", url, False .setRequestHeader "Content-Type", "application/json" .Send jsonData End With ' 处理响应 If objHTTP.Status = 200 Then Debug.Print "提交成功:" & objHTTP.responseText Else Debug.Print "错误:" & objHTTP.responseText End If Set objHTTP = Nothing End Sub ``` #### **示例2:处理异步请求** 异步模式下需绑定`onreadystatechange`事件: ```vba Sub AsyncRequest() Dim objHTTP As Object Set objHTTP = CreateObject("MSXML2.XMLHTTP") ' 绑定状态变化事件 objHTTP.onreadystatechange = GetRef("HandleResponse") objHTTP.Open "GET", "https://api.example.com/data", True objHTTP.Send ' 注意:异步模式下需保持VBA运行(如用DoEvents循环等待) Do While objHTTP.readyState <> 4 DoEvents Loop End Sub ' 回调函数处理响应 Sub HandleResponse() With objHTTP If .readyState = 4 And .Status = 200 Then Debug.Print .responseText End If End With End Sub ``` --- ### **常见问题与注意事项** 1. **SSL/TLS证书验证** 若目标URL使用HTTPS且证书无效,可能需忽略证书错误(仅限测试环境): ```vba Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' 更安全的替代方案 ``` 2. **超时设置** 添加超时限制避免程序卡死: ```vba objHTTP.setTimeouts 3000, 3000, 3000, 3000 ' 单位:毫秒(连接、发送、接收、总超时) ``` 3. **兼容性问题** - 不同Office版本可能支持不同XMLHTTP版本(如`MSXML2.XMLHTTP.6.0`更稳定)。 - 若报错“用户定义类型未定义”,检查是否正确引用库。 --- ### **替代方案对比** | **组件** | **特点** | |------------------------|-------------------------------------------------------------------------| | `WinHttp.WinHttpRequest.5.1` | 支持代理和更复杂的网络配置,但需手动处理Cookie。 | | `ServerXMLHTTP` | 支持同步/异步,自动处理重定向,适合高安全性场景。 | --- ### **总结** - **适用场景**:快速实现VBA与Web服务的交互(如爬虫、API调用)。 - **优点**:轻量级、无需外部依赖。 - **缺点**:异步模式需手动管理状态,复杂请求建议结合JSON解析库(如`ScriptControl`)。 通过合理使用`MSXML2.XMLHTTP`,可显著扩展VBA的自动化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值