【问题标题】:Use of WinHttpRequest in Excel 2003 under XPXP下Excel 2003中WinHttpRequest的使用
【发布时间】:2016-10-03 06:39:12
【问题描述】:

我正在使用下面的代码对我的 HTTP+JSON 网络服务执行 POST 和 GET 请求。一切都在 Win7 和 Excel 2013 下完美运行。在 Windows XP 和 Excel 2003 下测试时,GET 工作正常(请求正文包含 JSON 对象),但 POST 没有。应该通过线路发送的 JSON 数据看起来很完美,但在服务器端没有收到,客户端代码也没有报告错误。不幸的是,我无法安装嗅探器来查看真正发送的内容。修改代码以使用 MSXML2.ServerXMLHTTP 对象后,它工作正常(这将是解决方案)。有没有人有这个问题的经验?我试图弄清楚 为什么 它不适用于 WinHttpRequest...

'Copied from https://coderwall.com/p/pbxsyw/vba-web-requests
Private Function MakeWebRequest(Method As String, Url As String, PostData As String) As Boolean
    ' make sure to include the Microsoft WinHTTP Services in the project
    ' tools -> references -> Microsoft WinHTTP Services, version 5.1
    ' http://www.808.dk/?code-simplewinhttprequest
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384106(v=vs.85).aspx
    ' http://www.neilstuff.com/winhttp/

    On Error GoTo ErrorHandler:

    ' create the request object
    Set mobjWebReq = CreateObject("WinHttp.WinHttpRequest.5.1")

    ' set timeouts
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384061(v=vs.85).aspx
    ' SetTimeouts(resolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout)
    mobjWebReq.SetTimeouts 60000, 60000, 60000, 60000

    If Not LastUsedUrlMonitor Is Nothing Then
        LastUsedUrlMonitor.Value2 = Url
    End If

    ' make the request, http verb (method), url, false to force syncronous
    ' open(http method, absolute uri to request, async (true: async, false: sync)
    mobjWebReq.Open Method, Url, False

    ' handle post content type
    If Method = "POST" Then
        mobjWebReq.SetRequestHeader "Content-type", _
          "application/json"
        If Not LastHttpBodySendMonitor Is Nothing Then
            LastHttpBodySendMonitor.Value2 = PostData
        End If
    End If

    ' set WinHttpRequestOption enumerations
    ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx

    ' set ssl ignore errors
    '   13056: ignore errors
    '   0: break on errors
    mobjWebReq.Option(4) = 13056

    ' set redirects
    mobjWebReq.Option(6) = True

    ' allow http to redirect to https
    mobjWebReq.Option(12) = True

    ' send request
    ' send post data, should be blank for a get request
    mobjWebReq.Send PostData

    MakeWebRequest = True

    If Not LastHttpBodyReceivedMonitor Is Nothing Then
        LastHttpBodyReceivedMonitor.Value2 = mobjWebReq.Status & ": " & mobjWebReq.StatusText & ", Body: " & mobjWebReq.ResponseText
    End If

    Exit Function

ErrorHandler:
    Select Case Err.Number
        Case &H80072EFD
            MsgBox "Connection to URL: " & Chr(13) & Url & Chr(13) & "failed: " & Err.Description
        Case Else
            MsgBox Err.Number & Chr(13) & Err.Description
    End Select
    Err.Clear
    'Set mobjWebReq = Nothing
    MakeWebRequest = False
    Exit Function
End Function

【问题讨论】:

  • “但是服务器端没有收到”是什么意思?服务器的访问日志中甚至没有 POST 请求的条目?但是,如果有的话,请看一下并显示它所说的内容。如果 POST 请求被错误响应(例如 500),那么还要查看服务器的错误日志。
  • @axel-richter,服务器是一个 .NET WCF HTTP/JSON 服务,它使用端点行为记录传入请求。传入的 POST 请求已记录,但正文中似乎没有数据。这会导致错误的请求。
  • 幸运的是(对你来说很不幸,但即使在 2016 年使用 XP 也没有人可以工作)我没有运行 XP 来测试。但是为了获得帮助,最好显示传入 POST 的整个日志信息。 “体内似乎没有数据”有些神秘。
  • @axel-richter,你是对的。据我所知,请求正文中没有 数据。我写“似乎”是因为日志记录是在端点行为中完成的,并且可能是主体在某些较低的通信层中被丢弃。不幸的是,我没有 WCF 诊断日志记录。
  • 也许您可以尝试不使用mobjWebReq.SetTimeouts...。见msdn.microsoft.com/en-us/library/windows/desktop/…

标签: excel vba winhttprequest


【解决方案1】:

感谢阿克塞尔的回复。我刚刚解决了这个问题(拔掉头发后)。 显然这在 Excel 2003 中按预期工作:

mobjWebReq.Send (PostData)

这不起作用(虽然它确实在 Excel 2013 中工作)

mobjWebReq.Send PostData

看起来 PostData 在第二种情况下只是被忽略了,并且问题与对象类型无关。巧合的是,当我使用 ServerXMLHTTP 对象时,我也使用了括号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多