转载 Msxml2.ServerXMLHTTP与Msxml2.XMLHTTP区别

1.ServerXmlHttp

定义:ServerXMLHTTP 为不同 Web 服务器之间的服务器安全 HTTP 访问提供方法和属性。您可以使用此对象在不同的 Web 服务器之间交换 XML 数据。

被Microsoft XML Parser (MSXML) 版本 3.0 或更高版本提供,并且不支持windows95和windows98环境,支持windows2000,安装ie5的windows NT,windows2003以上版本,windows xp,vista等等系统。顾名思义他是使用在server端的组建。

SSL支持:

ServerXMLHTTP 组件在 MSXML3 中对 HTTPS 的支持比较有限。具体说就是,它们不完全支持用于身份验证的安全套接字层 (SSL) 证书。这些组件虽然支持 HTTPS 协议,但如果服务器要求客户端证书,请求将会失败。
  ServerXMLHTTP 在 MSXML 3.0 Service Pack 1 中包括了 SSL 证书支持。

优点:

通过使用 ServerXMLHTTP,可以在本地和远程系统之间以流或 XML 文档的形式交换 XML 数据;由于基础协议为 HTTP 或 HTTPS,因此可以在防火墙后的系统之间交换数据;ServerXMLHTTP 可用于从不同的环境(如 Active Server Pages (ASP)、Microsoft Visual Basic 和 Microsoft Visual C++)发送 HTTP 请求。

缺陷:

同时存在于单一进程中的 ServerXMLHTTP 实例数主要取决于可用于系统上应用程序的内存大小。但是其他因素(如 CPU 处理能力或者可用的套接字连接)会进一步限制可以同时处于活动状态的实例数。就MSXML 3.0 而言,可同时存在于单一进程中的最大实例数为5460。

值得注意的特性----一小时超时:

如果你的目标url实际上不存在,使用浏览器访问的时候会发生“找不到服务器或是发生dns错误”那么使用serverxmlhttp访问的时候可能会遇到长时间得不到response。

解决方案--设置超时时间

resolveTimeout = 10000   ‘ 解析DNS名字的超时时间,10秒

connectTimeout = 10000    ‘ 建立Winsock连接的超时时间,10秒

sendTimeout = 120000     ‘ 发送数据的超时时间,120秒

receiveTimeout = 60000     ' 接收response的超时时间,60秒

xmlHttp.setTimeouts resolveTimeout, connectTimeout, sendTimeout, receiveTimeout

For Example:
  BeginTimer = Timer()
  BeiginTime = Now()
  On error resume next
  dim xmlHttp As ServerXmlHttp
  Set xmlHttp = New  ServerXmlHttp
  resolveTimeout = 10000   ' 解析DNS名字的超时时间,10秒
  connectTimeout = 10000    ' 建立Winsock连接的超时时间,10秒
  sendTimeout = 120000     ' 发送数据的超时时间,120秒
  receiveTimeout = 60000     ' 接收response的超时时间,60秒
  'xmlHttp.setTimeouts resolveTimeout, connectTimeout, sendTimeout,
  receiveTimeout
  uRL ="http://202.118.89.4:4090/2333.asp"
  xmlHttp.Open "POST", sURL, False
  xmlHttp.send "1212312"EndTimer = Timer()
  TimeSpan_Send = EndTimer - BeginTimer
 
  EndTime = Now()
  msgbox  uRL & " okay!TimeSpan=" & CStr(TimeSpan_Send) & ";start:" & BeiginTime & ";EndTime:" & EndTime
 
  2.XMLHttp

与ServerXmlHttp相对应他是使用在client端的组建,由于 XMLHTTP 内部使用 WinInet,所以不支持在服务器端应用程序(例如 Active Server Pages (ASP))、宿主在 COM+ 中的组件,或 Windows 服务中使用 XMLHTTP。

优点:

XMLHTTP 具有一些优点,如支持缓存和自动发现代理。它可以在 Windows 95 和 Windows 98 平台上使用,并且非常适合单用户桌面应用程序。

支持SSL:

XMLHTTP 组件在 MSXML3 中对 HTTPS 的支持比较有限。具体说就是,它们不完全支持用于身份验证的安全套接字层 (SSL) 证书。这些组件虽然支持 HTTPS 协议,但如果服务器要求客户端证书,请求将会失败。

3.ServerXmlHttp和XmlHttp的区别

XMLHTTP 为客户端应用程序而设计,并依赖于基于 Microsoft Win32 Internet (WinInet) 而构建的 URLMon。ServerXMLHTTP 为服务器应用程序而设计,并依赖于新的 HTTP 客户端堆栈 WinHTTP。ServerXMLHTTP 提供了可靠性和安全性,并且是服务器安全的。

 
转载地址:http://blog.sina.com.cn/s/blog_5067ef490101hm61.html
 
发布一个自己写的ASP POST
 
Function   Post(url)

Dim  postData,textResponse

postData="user=xxxx&password=******"

Set ServerXmlHttp =Server.CreateObject("MSXML2.ServerXMLHTTP")  
ServerXmlHttp.open "POST", url ,false
'ServerXmlHttp.setTimeouts 10000,10000,10000,30000
ServerXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
ServerXmlHttp.send postData

If ServerXmlHttp.status = 200 Then
    textResponse = ServerXmlHttp.responseText
   Else
    textResponse="0"
End If

Set ServerXmlHttp = Nothing
End Function
 
 
 
 
 
 

转载于:https://www.cnblogs.com/wonderfuly/p/3278974.html

<think>我们使用VBA中的MSXML2.ServerXMLHTTP.6.0对象发送数据和附件时,通常需要构建一个符合HTTP协议的请求,特别是当需要发送文件附件时,我们需要使用multipart/form-data格式。以下步骤将指导你如何实现:###步骤1:创建ServerXMLHTTP对象首先,我们需要创建一个ServerXMLHTTP对象,并设置请求方法和URL。```vbaDimxmlhttpAsObjectSetxmlhttp=CreateObject("MSXML2.ServerXMLHTTP.6.0")```###步骤2:构建multipart/form-data请求体发送附件时,通常使用POST方法,并将Content-Type设置为`multipart/form-data`,同时生成一个边界字符串(boundary)来分隔不同的表单字段和文件。####构建请求体示例假设我们需要发送一个文本字段(例如`name`)和一个文件附件(例如`file`),我们需要按照以下格式构建请求体:```--boundary_stringContent-Disposition:form-data;name="name"JohnDoe--boundary_stringContent-Disposition:form-data;name="file";filename="test.txt"Content-Type:text/plain文件内容--boundary_string--```在VBA中,我们可以用字符串拼接的方式构建这个请求体,但需要注意边界字符串应该是唯一的,通常用一段随机字符串。###步骤3:设置请求头并发送在发送请求前,需要设置正确的请求头,包括Content-Type,并在其中指定边界字符串。###完整代码示例以下是一个完整的示例代码,演示如何发送一个包含文本字段和文件附件的请求:```vbaSubSendDataWithAttachment()DimxmlhttpAsObjectSetxmlhttp=CreateObject("MSXML2.ServerXMLHTTP.6.0")'目标URLDimurlAsStringurl="http://example.com/upload"'生成边界字符串,确保唯一性DimboundaryAsStringboundary="---------------------------"&Format(Now,"yyyyMMddhhmmss")'构建请求体DimbodyAsStringDimfilePathAsStringfilePath="C:\test.txt"'替换为实际文件路径DimfileContentAsString'读取文件内容OpenfilePathForBinaryAs#1fileContent=Space(LOF(1))Get#1,,fileContentClose#1'构建请求体body="--"&boundary&vbCrLfbody=body&"Content-Disposition:form-data;name=""name"""&vbCrLf&vbCrLfbody=body&"JohnDoe"&vbCrLfbody=body&"--"&boundary&vbCrLfbody=body&"Content-Disposition:form-data;name=""file"";filename="""&Mid(filePath,InStrRev(filePath,"\")+1)&""""&vbCrLfbody=body&"Content-Type:text/plain"&vbCrLf&vbCrLfbody=body&fileContent&vbCrLfbody=body&"--"&boundary&"--"'打开连接xmlhttp.Open"POST",url,False'设置请求头xmlhttp.setRequestHeader"Content-Type","multipart/form-data;boundary="&boundary'发送请求xmlhttp.sendbody'处理响应Ifxmlhttp.Status=200ThenMsgBox"上传成功!响应:"&xmlhttp.responseTextElseMsgBox"上传失败!状态码:"&xmlhttp.StatusEndIfEndSub```###注意事项1.**边界字符串**:必须确保边界字符串在请求体中唯一,且Content-Type头中指定的边界一致。2.**文件读取**:示例中使用了二进制方式读取文件,适用于文本文件。如果是二进制文件(如图片),需要将文件内容转换为Base64编码,并设置相应的Content-Type(如`image/jpeg`),但请注意,multipart/form-data格式通常直接发送二进制数据,不需要Base64编码(除非API特别要求)。在请求体中直接发送二进制数据时,VBA字符串可能无法正确表示二进制数据,因此需要使用字节数组发送。但是,ServerXMLHTTP的send方法接受字符串或字节数组。对于二进制文件,我们可以将文件内容读入字节数组,然后文本部分组合成完整的字节数组请求体。这需要更复杂的字节数组拼接,此处不展开。3.**大文件处理**:对于大文件,上述方法可能会消耗大量内存,建议使用其他方法(如分块上传)或考虑使用ADODB.Stream对象来构建请求体。###引用说明在构建multipart/form-data请求体时,遵循了HTTP协议规范[^1]。同时,根据引用[3],使用ServerXMLHTTP时,HTTP方法(如POST)必须使用大写[^3]。###相关问题1.如何使用VBA发送二进制文件(如图片)作为附件?2.如何通过VBA处理ServerXMLHTTP返回的响应数据,特别是当数据很大时?3.在VBA中如何实现文件的分块上传?[^1]:HTTP协议规范中关于multipart/form-data的部分。[^3]:MSXML2.ServerXMLHTTP.6.0中open方法提交方式要使用大写。</think>### 使用 VBA 通过 MSXML2.ServerXMLHTTP.6.0 发送数据和附件的方法 #### 一、核心步骤 1. **初始化对象** 创建 `MSXML2.ServerXMLHTTP.6.0` 对象并设置基础参数: ```vba Dim xmlhttp As Object Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") xmlhttp.Open "POST", "目标URL", False ' 注意方法必须大写[^3] ``` 2. **构建 multipart/form-data 请求体** 附件上传需使用 `multipart/form-data` 格式,包含: - 文本参数(如 `user=test`) - 文件参数(如 `file=@path.txt`) ```vba Dim boundary As String boundary = "----WebKitFormBoundary" & Format(Now, "yyyymmddhhnnss") xmlhttp.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary ``` 3. **拼接请求体** 按格式组合文本和文件内容: ```vba Dim body As String body = "--" & boundary & vbCrLf body = body & "Content-Disposition: form-data; name=""user""" & vbCrLf & vbCrLf body = body & "test" & vbCrLf ' 文本参数值 body = body & "--" & boundary & vbCrLf body = body & "Content-Disposition: form-data; name=""file""; filename=""data.txt""" & vbCrLf body = body & "Content-Type: application/octet-stream" & vbCrLf & vbCrLf body = body & "这里是文件内容" & vbCrLf ' 替换为实际文件内容 body = body & "--" & boundary & "--" ``` 4. **发送请求并处理响应** ```vba xmlhttp.send body If xmlhttp.Status = 200 Then MsgBox "成功:" & xmlhttp.responseText Else MsgBox "失败:" & xmlhttp.Status & " - " & xmlhttp.statusText End If ``` --- #### 二、完整示例代码 ```vba Sub SendDataWithAttachment() Dim xmlhttp As Object Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' 目标URL(替换为实际地址) Dim url As String url = "https://api.example.com/upload" ' 生成唯一边界标识 Dim boundary As String boundary = "----BOUNDARY_" & Format(Now, "yyyymmddhhnnss") ' 构建请求体 Dim body As String body = "--" & boundary & vbCrLf body = body & "Content-Disposition: form-data; name=""username""" & vbCrLf & vbCrLf body = body & "JohnDoe" & vbCrLf ' 文本参数 body = body & "--" & boundary & vbCrLf body = body & "Content-Disposition: form-data; name=""file""; filename=""report.txt""" & vbCrLf body = body & "Content-Type: text/plain" & vbCrLf & vbCrLf body = body & ReadFileAsText("C:\Files\report.txt") & vbCrLf ' 读取文件内容 body = body & "--" & boundary & "--" ' 发送请求 xmlhttp.Open "POST", url, False xmlhttp.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary xmlhttp.send body ' 处理响应 If xmlhttp.Status = 200 Then Debug.Print "响应内容:" & xmlhttp.responseText Else Debug.Print "错误代码:" & xmlhttp.Status End If End Sub ' 辅助函数:读取文件内容 Function ReadFileAsText(filePath As String) As String Dim fileContent As String Open filePath For Input As #1 fileContent = Input(LOF(1), #1) Close #1 ReadFileAsText = fileContent End Function ``` --- #### 三、关键注意事项 1. **文件二进制处理** 若需发送二进制文件(如图片),改用字节数组: ```vba Dim fileBytes() As Byte Open "C:\image.jpg" For Binary As #1 ReDim fileBytes(LOF(1) - 1) Get #1, , fileBytes Close #1 ' 在body中插入时需Base64编码 ``` 2. **大文件优化** 使用 `ADODB.Stream` 避免内存溢出: ```vba Dim stream As Object Set stream = CreateObject("ADODB.Stream") stream.Type = 1 ' adTypeBinary stream.Open stream.LoadFromFile "C:\largefile.zip" xmlhttp.send stream.Read ``` 3. **响应数据截断问题** 若 `responseText` 不完整,改用 `responseBody` 并转换编码[^5]: ```vba Dim bytes() As Byte bytes = xmlhttp.responseBody Dim responseText As String responseText = StrConv(bytes, vbUnicode) ``` --- #### 四、应用场景对比 | **组件** | 适用场景 | 是否缓存 | |------------------------|---------------------------------|----------| | `MSXML2.XMLHTTP` | 客户端脚本(需Cookie/Session缓存) | 是 | | `MSXML2.ServerXMLHTTP` | 服务器端/无状态操作(如API调用) | 否 | > 附件上传等服务器端操作推荐使用 `ServerXMLHTTP`[^2] --- ### 相关问题 1. **如何通过 VBA 处理服务器返回的 JSON 数据?** (需解析 JSON 并提取特定字段) 2. **VBA 中如何实现分块上传大文件?** (使用 `Content-Range` 头和多段请求) 3. **MSXML2.ServerXMLHTTP 如何添加自定义 HTTP 头部?** (如 `Authorization: Bearer token` 的设置方法) 4. **如何调试 VBA 的 HTTP 请求错误?** (捕获异常、查看完整响应头的方法) 5. **VBA 中如何实现异步 HTTP 请求?** (`Open` 方法的第三个参数设为 `True` 时的回调处理) [^1]: HTTP 协议中 multipart/form-data 格式规范 [^2]: ServerXMLHTTP XMLHTTP 的核心区别应用场景 [^3]: ServerXMLHTTP 的 HTTP 方法必须使用大写 [^5]: 处理 responseBody 数据截断的解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值