MSXML2.XMLHTTP

本文详细介绍了XmlHttp API的功能和用途,包括如何通过不同脚本语言使用该API进行HTTP请求及处理响应。此外还提供了属性、方法及事件的具体说明。
XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。
来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft® XML Document Object Model (DOM)处理回应。

现在的绝对多数浏览器都增加了对XmlHttp的支持,IE中使用ActiveXObject方式创建XmlHttp对象,其他浏览器如:Firefox、Opera等通过window.XMLHttpRequest来创建xmlhttp对象。

XmlHttp对象参考:
属性:
onreadystatechange* 指定当readyState属性改变时的事件处理句柄。只写
readyState 返回当前请求的状态,只读.
responseBody 将回应信息正文以unsigned byte数组形式返回.只读
responseStream 以Ado Stream对象的形式返回响应信息。只读
responseText 将响应信息作为字符串返回.只读
responseXML 将响应信息格式化为Xml Document对象并返回,只读
status 返回当前请求的http状态码.只读
statusText 返回当前请求的响应行状态,只读

* 表示此属性是W3C文档对象模型的扩展.

方法:
abort 取消当前请求
getAllResponseHeaders 获取响应的所有http头
getResponseHeader 从响应信息中获取指定的http头
open 创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)
send 发送请求到http服务器并接收回应
setRequestHeader 单独指定请求的某个http头


事件:

主  题: 在VC中使用XMLHTTP,怎样初始化,怎样建立连接?在线等。 我的一段代码在.NET中用C#已经调通,我想搬到VC++ 6.0上,但不知道任何各种写法规则。 C# 中为: MSXML2.XMLHTTP xmlHttp_ = new XMLHTTP(); xmlHttp_.open("PROPFIND", serverUrl, false, username, password); xmlHttp_.send(null); 放到VC++ 6.0 中应为什么? 以下是我写的,但运行出错。 #import "msxml4.dll" using namespace MSXML2; HRESULT hr; //MSXML2::IXMLHTTPRequest pIXMLHttpRequest; CString serverUrl ="http://services.msn.com/svcs/hotmail/httpmail.asp"; MSXML2::IXMLHTTPRequestPtr pIXMLHttpRequest; pIXMLHttpRequest.CreateInstance("Msxml2.XMLHTTP.4.0"); if (pIXMLHttpRequest==NULL) AfxMessageBox("pIXMLHttpRequest error"); try { // Create XMLHttpRequest object and initialize pIXMLHttpRequest. hr = pIXMLHttpRequest->open(_bstr_t(_T("PROPFIND")), _bstr_t(_T(serverUrl)), _variant_t(VARIANT_FALSE), _variant_t("test5_12"), _variant_t("1234567")); if(SUCCEEDED(hr)) ::MessageBox(NULL, _T("Success !"), _T(""), MB_OK); } catch(...) { //DisplayErrorToUser(); AfxMessageBox("error"); } 在调用方法open的时候出错! 回复人: masterz(www.fruitfruit.com) ( ) 信誉:273 2003-06-10 21:34:02Z 得分:20 ? #import "msxml.dll" #import "msxml2.dll" using namespace MSXML2; int main(int argc, char* argv[]) { printf("Test of XMLHTTP by masterz!\n"); CoInitialize(NULL); try { IXMLHTTPRequestPtr xmlrequest; xmlrequest.CreateInstance("Msxml2.XMLHTTP"); _variant_t varp(false); xmlrequest->open(_bstr_t("GET"),_bstr_t("http://www.csdn.net/expert/topic/855/855052.xml?temp=.176037"),varp); xmlrequest->send(); BSTR bstrbody; xmlrequest->get_responseText(&bstrbody); _bstr_t bstrtbody(bstrbody); printf("%s\n",(LPCTSTR)bstrtbody); } catch (_com_error &e) { printf("Description = '%s'\n", (char*) e.Description()); } CoUninitialize(); printf("program end\n"); return 0; } ///////Post with XMLHTTP/////////////////////// #import "msxml.dll" #import "msxml2.dll" #include "Atlbase.h" using namespace MSXML2; int main(int argc, char* argv[]) { printf("Test of XMLHTTP by masterz!\n"); CoInitialize(NULL); try { IXMLHTTPRequestPtr xmlrequest; //xmlrequest.CreateInstance("Msxml2.XMLHTTP"); xmlrequest.CreateInstance(__uuidof(XMLHTTP)); CComVariant vFalse(FALSE); CComVariant vNull(NULL); xmlrequest->open("POST", _bstr_t("http://211.157.102.21/member/logon.asp"),vFalse,vNull,vNull); xmlrequest->setRequestHeader("Content-Type:","application/x-www-form-urlencoded"); _bstr_t bsdata("name=xxx&pass=xxx&type=1");//use your login name and password xmlrequest->send(_variant_t(bsdata)); BSTR bstrbody; xmlrequest->get_responseText(&bstrbody); _bstr_t bstrtbody(bstrbody); printf("%s\n",(LPCTSTR)bstrtbody); //MessageBox(0,bstrtbody,"",MB_OK); } catch (_com_error &e) { printf("Description = '%s'\n", (char*) e.Description()); } CoUninitialize(); printf("program end\n"); return 0; }
<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,或者讨论XMLHTTP与ServerXMLHTTP的区别?可能用户没有提到,但简要说明可以帮助他们更好地选择。 确保语言通俗易懂,避免太多技术术语,但也要准确。结构要清晰,分步骤或分点,方便用户一步步操作。如果有潜在的问题或注意事项,比如异步处理需要等待,或者内存泄漏的问题,也需要提及。 总之,回答需要全面覆盖使用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、付费专栏及课程。

余额充值