XMLHTTP POST GET 。MSXML2.ServerXMLHTTP | Microsoft.XMLHTTP 一点心得

本文详细介绍了使用VBScript中的XMLHTTP对象进行GET和POST请求的方法,包括设置请求头、发送请求、处理响应等关键步骤,并提供了具体示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XMLHTTP POST GET  

Option Explicit

Function GetPage(Url As String, Optional Host As String = "", Optional Cookie As String = "", Optional Referer As String = "", Optional HeaderStr As String = "", Optional ByRef GetCookie As String)
'编写: 风飞雪 http://hi.baidu.com/f_fx 2009年5月25日
On Error Resume Next
    Dim HTTP As New XMLHTTP
    'Dim HTTP
    'Set HTTP = CreateObject("Microsoft.XMLHTTP")
    
    Dim Header
    Dim HeaderName As String
    Dim HeaderData As String
    Dim I

    With HTTP
        .Open "Get", Url, False
        If HeaderStr <> "" Then
          HeaderStr = vbNewLine & HeaderStr
          HeaderStr = Replace(HeaderStr, vbNewLine & vbNewLine, "")
          Header = Split(HeaderStr, vbNewLine)
          For I = 0 To UBound(Header) - 1
            If Header(I) <> "" Then
               HeaderName = Trim(Mid(Header(I), 1, InStr(Header(I), ":") - 1))
               HeaderData = Trim(Mid(Header(I), InStr(Header(I), ":") + 1))
               If HeaderName <> "" And HeaderData <> "" Then .setRequestHeader HeaderName, HeaderData
            End If
          Next I
        End If

       If Referer <> "" Then .setRequestHeader "Referer", Referer
       If Host <> "" Then .setRequestHeader "Host", Host
       If Cookie <> "" Then .setRequestHeader "Cookie", Cookie
       .send
       If Err.Number = 0 Then
         GetCookie = .getResponseHeader("Set-Cookie")
         'Debug.Print .getAllResponseHeaders
         GetPage = BytesToBstr(.responseBody, "GB2312")
       End If
    End With
    Set HTTP = Nothing
End Function


Function PostData(PostUrl As String, PostStr As String, Optional Host As String = "", Optional PostCok As String = "", Optional PostRef As String = "", Optional HeaderStr As String = "", Optional Cset As String = "GB2312", Optional ByRef GetCookie As String)
'编写: 风飞雪 http://hi.baidu.com/f_fx 2009年5月25日
    On Error Resume Next
    Dim HTTP As New XMLHTTP
    'Dim HTTP
    'Set HTTP = CreateObject("Microsoft.XMLHTTP")
    Dim Header
    Dim HeaderName As String
    Dim HeaderData As String
    Dim I
    'PostStr = URLEncoding(PostStr)
    With HTTP
        .Open "POST", PostUrl, False
        If HeaderStr <> "" Then
          HeaderStr = vbNewLine & HeaderStr
          HeaderStr = Replace(HeaderStr, vbNewLine & vbNewLine, "")
          Header = Split(HeaderStr, vbNewLine)
          For I = 0 To UBound(Header) - 1
            If Header(I) <> "" Then
               HeaderName = Trim(Mid(Header(I), 1, InStr(Header(I), ":") - 1))
               HeaderData = Trim(Mid(Header(I), InStr(Header(I), ":") + 1))
               If HeaderName <> "" And HeaderData <> "" Then .setRequestHeader HeaderName, HeaderData
            End If
          Next I
        End If

        If PostRef <> "" Then .setRequestHeader "Referer", PostRef
        If Host <> "" Then .setRequestHeader "Host", Host
        If PostCok <> "" Then .setRequestHeader "Cookie", PostCok
        .setRequestHeader "Content-Length", Len(PostStr)
        .send PostStr
    End With
    If Err.Number <> 0 Then
        PostData = ""
      Else
        GetCookie = HTTP.getResponseHeader("Set-Cookie")
        Select Case Cset
           Case "responseText"
             PostData = HTTP.responseText
           Case "responseBody"
             PostData = HTTP.responseBody
           Case "responseXML"
             PostData = HTTP.responseXML
           Case "responseStream"
             PostData = HTTP.responseStream
           Case Else
             PostData = BytesToBstr(HTTP.responseBody, Cset)
         End Select
    End If
    Set HTTP = Nothing
End Function

Function URLEncoding(vstrIn)
Dim strReturn, ThisChr, InnerCode, Hight8, Low8, i
        strReturn = ""
        For i = 1 To Len(vstrIn)
            ThisChr = Mid(vstrIn, i, 1)
            If Abs(Asc(ThisChr)) < &HFF Then
                strReturn = strReturn & ThisChr
            Else
                InnerCode = Asc(ThisChr)
                If InnerCode < 0 Then
                    InnerCode = InnerCode + &H10000
                End If
                Hight8 = (InnerCode And &HFF00) \ &HFF
                Low8 = InnerCode And &HFF
                strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8)
            End If
        Next
        URLEncoding = strReturn
End Function

Function BytesToBstr(Body, Cset)
    Dim ADOS
    Set ADOS = CreateObject("Adodb.Stream")
    With ADOS
      .Type = 1
      .Mode = 3
      .Open
      .Write Body
      .Position = 0
      .Type = 2
      .Charset = Cset
      BytesToBstr = .ReadText
      .Close
    End With
    Set ADOS = Nothing
End Function


Function bytes2BSTR(vIn)
    Dim strReturn
    Dim i, ThisCharCode, NextCharCode
    strReturn = ""
    For i = 1 To LenB(vIn)
        ThisCharCode = AscB(MidB(vIn, i, 1))
        If ThisCharCode < &H80 Then
            strReturn = strReturn & Chr(ThisCharCode)
        Else
            NextCharCode = AscB(MidB(vIn, i + 1, 1))
            strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
            i = i + 1
        End If
    Next
    bytes2BSTR = strReturn
End Function

 

'使用方式

Dim HeaderStr As String
HeaderStr = ""
HeaderStr = HeaderStr & vbNewLine & "Accept: */*"
HeaderStr = HeaderStr & vbNewLine & "Referer: http://hi.baidu.com/f%5FFX"
HeaderStr = HeaderStr & vbNewLine & "Accept -Language: zh -cn"
HeaderStr = HeaderStr & vbNewLine & "Accept -Encoding: gzip , deflate"
HeaderStr = HeaderStr & vbNewLine & "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
HeaderStr = HeaderStr & vbNewLine & "Host: hi.baidu.com"
HeaderStr = HeaderStr & vbNewLine & "Connection: Keep -Alive"
HeaderStr = HeaderStr & vbNewLine & "Cookie: BAIDUID=4BCD69B2A430279A066A9D7811B29C51:FG=1; BDLFONT=0; BDUSS=IzbzZ4cEZ0UENkT3ViR3FkNWlGTDVKTlJVUzM4TGpyY0txLXh4b1dMUmNqa05LQVFBQUFBJCQAAAAAAAAAAApBESIebasBRl9GWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoTeABAAAAAFxJ4AEAAAAAMEngAQAAAACQfEJaAAAAAFwBHEpcARxKbU; _BDSC=1; IM_old=2|fv5b96ho; BDSTAT=20b33235dac31c427539037af7491398292756086c061d951e7b020879f434d5; BDSP=0a2d0d95a8ed8a13bdd6dffce96e3a8e20ca12fa4f508d96d9c8276d55fbb2fb43166d224f4a20a4462309f790529822720e0cf3d7ca7bcb0a46f21fbe096b63f6246b600c338744ebf81a4c510fd9f9d72a6059252dd42a2834349b033b5bb5cbeac1d9; BDSPINFO=d787becfb6f5cf39b600c8f1|F_FX|f_fx|30912d00962fe635571147ec7de05377; BDOPINFO=d787becfb6f5cf39b600c8f1|F_FX|f_fx|30912d00962fe635571147ec7de05377"
GetPage "http://hi.baidu.com/f%5Ffx/creat/blog/", , , , HeaderStr


Dim HeaderStr As String
HeaderStr = ""
HeaderStr = HeaderStr & vbNewLine & "Accept: */*"
HeaderStr = HeaderStr & vbNewLine & "Accept -language: zh -Cn"
HeaderStr = HeaderStr & vbNewLine & "Referer: http://172.25.208.10:8080/ept/component.do"
HeaderStr = HeaderStr & vbNewLine & "User -Agent: Microsoft.XMLHTTP"
HeaderStr = HeaderStr & vbNewLine & "Accept -encoding: gzip , deflate"
HeaderStr = HeaderStr & vbNewLine & "Host: 172.25.208.10:8080"
HeaderStr = HeaderStr & vbNewLine & "Connection: Keep -Alive"
HeaderStr = HeaderStr & vbNewLine & "cache -Control: no -cache"

Call PostData("http://172.25.208.10:8080/ept/component.do?name=cmp_jjhk_djbjgk_print&event=show&para=", _
                      "<msginfo><parameters><parameter name=QueryLX>JGK</parameter><parameter name=QYGTLX>0</parameter><parameter name=ZCH>4304233000111</parameter><parameter name=DAHS></parameter><parameter name=DAHF></parameter><parameter name=DDMS></parameter><parameter name=DDMF></parameter><parameter name=NEW>0</parameter><parameter name=HYDM></parameter><parameter name=DJJG></parameter><parameter name=QYLX></parameter><parameter name=JGDW></parameter><parameter name=ACTION>query</parameter><parameter name=QUERY></parameter></parameters></msginfo>", _
                     , , , HeaderStr)

 

===========================================================

MSXML2.ServerXMLHTTP | Microsoft.XMLHTTP 一点心得  

最近在做个网站采集,发送软件.

一直是用Microsoft.XMLHTTP采集,用MSXML2.ServerXMLHTTP发送.

就在今天向一个网站用MSXML2.ServerXMLHTTP发送信息时,POST信息竟然是空的.改用Microsoft.XMLHTTP控件,问题解决.
以前并没有太在意这两个控件的区别.

并不是所有的网站用MSXML2.ServerXMLHTTP发送信息时,POST的信息是空,只有个别的网站是这样的.应该是跟网站的空间有关系.

<think>嗯,用户问的是关于VBA中的MSXML2.XMLHTTP,这应该是一个用来发送HTTP请求的对象。首先,我需要回忆一下这个对象的基本用法和常见场景。用户可能想用VBA来自动化网页数据获取或者与API交互,对吧? 首先,得确认用户的需求是什么。他们可能是想了解如何用VBA发送GETPOST请求,或者处理返回的数据。可能他们遇到了什么问题,比如如何设置请求头,处理超时,或者处理异步请求?需要覆盖这些基础内容。 接下来,我应该分步骤介绍,先说明如何引用库,然后创建对象,发送请求,处理响应。可能还需要提到常见的属性和方法,比如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、付费专栏及课程。

余额充值