Уважаемые форумчане! Имеется система : Win 7 - 64 , Excel 2007 Имеется код:
Код
Function SendRequest(Url, AppKey, Session, Data) As String
On Error GoTo ErrorHandler:
Dim xhr: Set xhr = CreateObject("MSXML2.XMLHTTP" )
With xhr
.Open "POST", Url & "/", False
.setRequestHeader "X-Application", AppKey
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
End With
If Session <> "" Then
xhr.setRequestHeader "X-Authentication", Session
End If
xhr.send Data
Dim timing
timing = 0
While xhr.readyState <> 4
xhr.waitForResponse 1
timing = timing + 1
Cells(19, 1).value = timing
Wend
SendRequest = xhr.responseText
If xhr.Status <> 200 Then
Err.Raise vbObjectError + 1000, "Util.SendRequest", "The call was unsuccessful. Status code: " & xhr.Status & " " & xhr.statusText & ". Response was: " & xhr.responseText
End If
Set xhr = Nothing
Exit Function
ErrorHandler:
SendRequest = ""
End Function
При использовании данного синхронного запроса возникает зависание excel если: разорвалось интернет соединение либо сервер не отвечает на запрос , что категорически неприемлимо для работы программы. Таймаута для синхронного запроса насколько я понял из интернет(я программист-любитель ,не пеняйте)) нет , при разрыве соединения он правда секунд 30(но это редко,да и слишком много необходимо максимум секунд 5) . Помогите , пожалуйста, сделать асинхронный запрос, с таймаутом в 5 сек, если ответа так и не поступило то необходимо повторить запрос .
Function SendRequest(Url, AppKey, Session, Data) As String
On Error Resume Next
Dim xhr As Object, timeout&
Set xhr = CreateObject("MSXML2.XMLHTTP")
timeout& = 5 ' в секундах
With xhr
.Open "POST", Url & "/", True ' true вместо false, чтобы запрос был асинхронный
.setRequestHeader "X-Application", AppKey
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
If Len(Session) Then .setRequestHeader "X-Authentication", Session
.send Data
If .WaitForResponse(timeout&) Then ' ожидание ответа в течение timeout& секунд
SendRequest = .responseText
End If
End With
Set xhr = Nothing
End Function
Спасибо,но к сожалению, при таком варианте выход из функции происходит сразу,не дожидаясь прихода ответа от сервера...Необходимо чтобы выход из функции происходил только в двух случаях - либо ответ получен,либо неполучен в течении 5 секунд . Для этого я пытался использовать
Код
While xhr.readyState <> 4
, но эффекта нет . Возможно как-то можно прикрутить onreadystatechange ,но пока не понимаю как
выход из функции происходит сразу,не дожидаясь прихода ответа от сервера...
не должно такого быть возможно, что-то не так делаете покажите пример вызова функции (макрос, вызывающий SendRequest) со всеми нужными реальными данными (чтобы можно было протестировать) тогда получите готовый проверенный код
Эти методы excel никак не признавал существующими для объекта
Код
.setTimeouts
.WaitForResponse
Погуглив решил попробовать поменять MSXML2.XMLHTTP на WinHttp.WinHttpRequest.5.1 метод setTimeouts отрабатывает как надо для синхронного запроса) собственно проблема решена,спасибо за помощь)
Код
Function SendRequest(Url, AppKey, Session, Data) As String
On Error GoTo ErrorHandler:
Dim xhr: Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1" ) ' тут заменил вот это CreateObject("MSXML2.XMLHTTP" )
With xhr
.setTimeouts 5000, 5000, 10000, 10000
.Open "POST", Url & "/", False
.setRequestHeader "X-Application", AppKey
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.send Data
End With
If Session <> "" Then
xhr.setRequestHeader "X-Authentication", Session
End If
SendRequest = xhr.responseText
Set xhr = Nothing
Exit Function
ErrorHandler:
End Function
aluminii пишет: Эти методы excel никак не признавал существующими для объекта .setTimeouts,.WaitForResponse Погуглив решил попробовать поменять MSXML2.XMLHTTP наWinHttp.WinHttpRequest.5.1
вам светлая мысль приходила на Новый Год - отчего же не сказать это вслух
Цитата
Надо подключить в Tools - References библиотеку Microsoft WinHTTP Services 5.1
как сказал Игорь ещё !! здесь p.s. ну или использовать "позднее связывание" как вы...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)