2016-10-03 13 views
0

Я использую приведенный ниже код для выполнения 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 
+0

«но он не получен на стороне сервера» означает что? Даже нет записи в журнале доступа к серверу для запроса POST? Но если есть, но, пожалуйста, посмотрите и покажите, что он говорит. Если на запрос POST была получена ошибка (например, 500), просмотрите также журнал ошибок сервера. –

+0

@ axel-richter, сервер - это служба WCF HTTP/JSON .NET WCF, которая регистрирует входящие запросы, используя поведение конечной точки. Входящий запрос POST регистрируется, но, похоже, в теле нет данных. Это приводит к плохим запросам. –

+0

К счастью (к сожалению, для вас, но никто не должен работать даже с XP в 2016 году) У меня нет XP для тестирования. Но для получения справки было бы неплохо, если бы вы отображали всю информацию журнала для входящего POST. «Кажется, нет данных в теле», это несколько загадочно. –

ответ

0

Спасибо за ответы Axel. Я просто решил проблему (вытащив волосы). Видимо, это работает, как ожидается, в Excel 2003:

mobjWebReq.Send (PostData) 

И это не (в то время как она делает работы в Excel 2013)

mobjWebReq.Send PostData 

Похоже, PostData просто игнорируются во втором case, и проблема не была связана с типом объекта. Кстати, когда я использовал объект ServerXMLHTTP, я также использовал скобки.