VBA: XMLHTTP-запрос терпит неудачу, пока я не переключаю POST / GET - PullRequest
1 голос
/ 01 мая 2020

Хорошо, мне нужна коллективная мудрость 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 строка со следующей ошибкой: enter image description here

Однако, если я изменю "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 и посмотрите, работает ли это, хотя это ненавистный, хакерский обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...