Хорошо, мне нужна коллективная мудрость inte rnet в этом вопросе.
Я звоню по API из Excel (сокращенный код, большая часть этого кода я получил онлайн. Нужно использовать поздно привязка, но не уверен, что MSXML2.XMLHTTP.6.0 лучше всего использовать - Excel 365):
Dim body as String
Dim request as Object
Dim isAsync as Boolean
Set request = CreateObject("MSXML2.XMLHTTP.6.0")
isAsync = False
body = "...just some query params"
With request
.Open "POST", authUrl, isAsync
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send body
'spin wheels whilst waiting for response
While request.ReadyState <> 4
DoEvents
Wend
Debug.print(.responseText)
End With
Проблема, с которой я сталкиваюсь, заключается в том, что при первом запуске этого кода происходит сбой .send body
строка со следующей ошибкой:
Однако, если я изменю "POST"
на "GET"
, это снова не удастся, хотя сервер не принимает этот метод по всей видимости. Но затем, если я изменил его обратно на POST
и снова запустил, он работает нормально!
Затем, если я сохранил файл, закройте Excel, снова откройте файл и попробуйте запустить, снова это тоже самое ошибка, как указано выше!
Так почему я должен «встряхнуть» это так, переключая метод туда-сюда? Это не имеет никакого смысла для меня, почему это работает. Очевидно, я не могу сказать своим конечным пользователям возиться с таким кодом, поэтому я хотел бы знать, что происходит. Что я могу проверить и попробовать?
Обновление (5 мая):
Если установить точку останова на .send body
, попробуйте перешагнуть через нее (ошибки) и отладки, я вижу, что request.status
имеет значение 12019, что, по-видимому, является своего рода поддельным IE код ошибки (?). Я запускаю это на машине, на которой установлены IE 11, Edge и Chrome. Будет ли изменение строки User Agent что-нибудь делать? Я попробовал строку Chrome, как указано в MDN, а также просто «MyApp», но она ничего не изменила.
На данный момент, мне интересно, нужно ли мне просто сделать On Error Resume Next
, попробуйте как есть, затем отправьте запрос снова с GET
, а затем снова с POST
и посмотрите, работает ли это, хотя это ненавистный, хакерский обходной путь.