XMLhttp.setTimeouts

本文介绍XMLHttpRequest对象的setTimeouts方法用于设置四种不同的超时时间,并详细解释了每种超时的作用及默认值。此外,还列举了HTTP请求的各种状态码及其含义。

setTimeouts(resolveTimeout,connectTimeout,sendTimeout,receiveTimeout) 

 

XMLhttp.setTimeouts(10000,10000,10000,30000);//单位毫秒

 

参数:
  1、解析响应时间:resolveTimeout,数据类型:长整型。

  简单地说就是程序对目标主机的名字解析解析的一个过程时间。默认值是无限制,就是意味着不会超时。

  2、连接响应时间:connectTimeout,数据类型:长整型。

  程序和目标服务器socket建立一个通讯。默认超时时间为60秒。

  3、发送请求数据响应时间:sendTimeout,数据类型:长整型。

  发送数据包给目标服务器,一个大的数据包通常被分割成若干个小的数据包来一个个的发送,程序发送各个数据包的发送响应超时时间。默认值是5分钟。

  4、接受数据响应时间:receiveTimeout,数据类型:长整型。

  从目标服务器返回的数据包。一个大的数据包通常被分割成若干个小的数据包来一个个的发送,程序从服务器接受各个数据包的响应超时时间。默认为60分钟。


  ASP:

Function Getxml(url)
 On Error Resume Next
 Set objXML = server.CreateObject("MSXML2.ServerXMLHTTP")
 objXML.SetTimeOuts 10000,10000,10000,50000
 objXML.open "GET",url,false
 objXML.send()
 If objXML.ReadyState = 4 And objXML.Status = 200 then 
  Getxml = objXML.ResponseBody
 End If
 Set objXML = Nothing
 If Err.number <> 0 Then 

   Err.Clear 

  End If
End Function

 

 

  XMLHttpRequest 对象  http://www.w3school.com.cn/xml/xml_http.asp

                                     http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 

 

 

http请求状态及其含义

   

   

100

客户必须继续发出请求

404

没有发现文件、查询或URl

101

客户要求服务器根据请求转换HTTP协议版本

405

用户在Request-Line字段定义的方法不允许

200

交易成功

406

根据用户发送的Accept拖,请求资源不可访问

201

提示知道新文件的URL

407

类似401,用户必须首先在代理服务器上得到授权

202

接受和处理、但处理未完成

408

客户端没有在用户指定的饿时间内完成请求

203

返回信息不确定或不完整

409

对当前资源状态,请求不能完成 

204

请求收到,但返回信息为空

410

服务器上不再有此资源且无进一步的参考地址

205

服务器完成了请求,用户代理必须复位当前已经浏览过的文件

411

服务器拒绝用户定义的Content-Length属性请求

206

服务器已经完成了部分用户的GET请求

412

一个或多个请求头字段在当前请求中错误

300

请求的资源可在多处得到

413

请求的资源大于服务器允许的大小

301

删除请求数据

414

请求的资源URL长于服务器允许的长度

302

在其他地址发现了请求数据

415

请求资源不支持请求项目格式

303

建议客户访问其他URL或访问方式

416

请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

304

客户端已经执行了GET,但文件未变化

417

服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求

305

请求的资源必须从服务器指定的地址得到

500

服务器产生内部错误

307

申明请求的资源临时性删除

501

服务器不支持请求的函数

400

错误请求,如语法错误

502

服务器暂时不可用,有时是为了防止发生系统过载

401

请求授权失败

503

服务器过载或暂停维修

402

保留有效ChargeTo头响应

504

关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长

403

请求不允许

505

服务器不支持或拒绝支请求头中指定的HTTP版本

Function GetMergedCellsInfo(filepath As String) As Variant Dim wb As Workbook, ws As Worksheet Dim lastRow As Long, i As Long Dim area As Range, cell As Range Dim JsonData() As Variant Dim resultDict As Object Dim results As New Collection Dim calcState As XlCalculation Dim screenState As Boolean Dim PostData As Object calcState = Application.Calculation screenState = Application.ScreenUpdating Application.Calculation = xlCalculationManual Application.ScreenUpdating = False If Dir(filepath) = "" Then Err.Raise 53, , "文件不存在" Set wb = Workbooks.Open(filepath) Set ws = wb.Sheets(1) lastRow = ws.Cells(ws.Rows.count, "A").End(xlUp).Row i = 1 Do While i <= lastRow If ws.Cells(i, 1).MergeCells Then Set area = ws.Cells(i, 1).MergeArea JsonData = SendGetRequest(ws.Cells(area.Row, 1).value) For Each cell In ws.Range("S" & i, "X" & i + area.Rows.count - 1) Set resultDict = CreateObject("Scripting.Dictionary") resultDict("SAMPLE_ID") = JsonData(0) resultDict("Group_ID") = "2" resultDict("TP_ID") = "11868" resultDict("RESULT") = cell.value results.Add resultDict Next cell PostData("SampleIDList") = JsonData(1) PostData("ResultList") = results i = i + area.Rows.count Else i = i + 1 End If Loop CleanExit: wb.Close False Set ws = Nothing Set wb = Nothing Application.Calculation = calcState Application.ScreenUpdating = True Exit Function End Function 'get request Function SendGetRequest(order_no As String) As Variant() On Error GoTo ErrorHandler Dim httpRequest As Object Dim url As String Dim jsonArray As Object Dim jsonResult(0 To 1) As Variant Dim firstItem As Object jsonResult(0) = vbNullString jsonResult(1) = vbNullString Set httpRequest = CreateObject("MSXML2.XMLHTTP.6.0") url = "http://cn-dc-lims-trg.tuv.group/LabAPI/api/LimsApi/GetSampleIDsBySalesOrderNo/" & order_no With httpRequest .Open "GET", url, False .setTimeouts 5000, 5000, 5000, 5000 .send If .Status = 200 Then Dim validJson As String validJson = Replace(.responseText, "'", """") validJson = Replace(validJson, ":""null""", ":null") Set jsonArray = JsonConverter.ParseJson(validJson) If jsonArray.count > 0 Then Set firstItem = jsonArray(1) jsonResult(0) = firstItem("SAMPLE_ID") jsonResult(1) = jsonArray End If Else Err.Raise vbObjectError, , "HTTP Error " & .Status End If End With CleanExit: SendGetRequest = jsonResult Set httpRequest = Nothing Exit Function ErrorHandler: jsonResult(0) = "ERROR" jsonResult(1) = "Error " & Err.Number & ": " & Err.Description Resume CleanExit End Function这两段代码有什么问题吗
最新发布
12-16
<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的自动化能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值