Я использую приведенный ниже код для выполнения POST и GET-запросов к моему веб-сервису HTTP + JSON. Все работает отлично под Win7 и Excel 2013. При тестировании в Windows XP и Excel 2003 GET отлично работал (тело запроса содержит объект JSON), но POST этого не делал. Данные JSON, которые должны быть отправлены по линии, выглядят идеально, но они не принимаются на стороне сервера, а клиентский код не сообщает об ошибке. К сожалению, я не могу установить снифферы, чтобы увидеть, что действительно посылает. После изменения кода для использования объекта MSXML2.ServerXMLHTTP он отлично работает (таким образом, это будет решение). У кого-нибудь есть опыт в этой проблеме? Я пытаюсь выяснить, почему он не работает с WinHttpRequest ...Использование WinHttpRequest в Excel 2003 под XP
'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, сервер - это служба WCF HTTP/JSON .NET WCF, которая регистрирует входящие запросы, используя поведение конечной точки. Входящий запрос POST регистрируется, но, похоже, в теле нет данных. Это приводит к плохим запросам. –
К счастью (к сожалению, для вас, но никто не должен работать даже с XP в 2016 году) У меня нет XP для тестирования. Но для получения справки было бы неплохо, если бы вы отображали всю информацию журнала для входящего POST. «Кажется, нет данных в теле», это несколько загадочно. –