Цикл VBA xmlhttprequest без закрытия соединения - PullRequest
0 голосов
/ 08 июня 2019

Я подключаюсь к API, используя xmlhttp в VBA. Проблема в том, что мне нужно создать цикл несколько раз, используя одну и ту же ссылку API, с той лишь разницей, что я отправляю другую строку JSON.

Можно ли открыть соединение и отправить заголовки и аутентификацию только один раз, затем отправить данные и получить ответ несколько раз?

Основная цель - повысить скорость кода. Я знаю, что я могу отправить заголовок и аутентифицироваться внутри цикла, но он работает слишком медленно для моих нужд.

Спасибо!

APIKey = "xx" 
Session = "ss" 
API_Link = "zz" 
Dim xhr: Set xhr = CreateObject("MSXML2.XMLHTTP")
With xhr
.Open "POST", API_Link, False
.setRequestHeader "X-Application", APIKey
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Accept", "application/json"
.setRequestHeader "X-Authentication", Session
End With
For Each cl In Rng
'The below runs only the first time then it gives an error 
xhr.send JSON_Query
a = xhr.ResponseText 
next cl

1 Ответ

0 голосов
/ 08 июня 2019

Нет, я не верю, что вы можете с xmlhttp (рад, что вы оказались неправы) с точки зрения сохранения заголовков.Лучшее, что вы можете сделать, это создать объект xmlhttp вне цикла и хранить определенные значения в переменных для повторного использования.Вы все еще должны предоставить транзакции .Get, .Send и заголовков.

С точки зрения сохранения аутентификации, я думаю, вы можете войти один раз, а затем передать куки (JSESSION) в последующих запросах - в зависимости от срока действия - используя MSXML2.ServerXMLHTTP .

На других языках, например на python, у вас есть реализация http сессий .Это позволяет сохранять определенные параметры в запросах.

Постоянное соединение HTTP

Постоянное соединение HTTP, также называемое поддержанием активности HTTP или повторное использование соединения HTTP,Идея заключается в использовании одного TCP-соединения для отправки и получения нескольких HTTP-запросов / ответов, в отличие от открытия нового соединения для каждой пары запросов / ответов.Более новый протокол HTTP / 2 использует ту же идею и развивает ее, позволяя мультиплексировать несколько одновременных запросов / ответов по одному соединению.

В Python, , например, :

Сессии также можно использовать для предоставления данных по умолчанию для методов запроса.Это делается путем предоставления данных свойствам объекта Session.

Итак, вы создаете объект Session, который имеет те же методы, что и библиотека API, которая выдает запросы (как это делает xmlhttp).), а затем обновить заголовки, которые сохраняются.

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('https://httpbin.org/headers', headers={'x-test2': 'true'})

A сеанс идентифицирует запросы, исходящие из одного и того же браузера в течение периода разговора.Все сервлеты могут использовать один и тот же сеанс.JSESSIONID генерируется сервером и может быть передан клиенту через куки Шринивас Баласани

Преимущества:

  1. Снижение задержки в последующих запросах (нетhandshaking).
  2. Снижение использования ЦП и циклических обращений из-за уменьшения количества новых подключений и квитирования TLS.
  3. Включение HTTP-конвейеризации запросов и ответов.
  4. Уменьшение перегрузки сети (меньшеTCP-соединения).
  5. Об ошибках можно сообщать без штрафа за закрытие TCP-соединения.

Согласно RFC 7230, раздел 6.4, «клиент должен ограничивать количество одновременныхоткрытые соединения, которые он поддерживает с данным сервером ".В предыдущей версии спецификации HTTP / 1.1 были указаны конкретные максимальные значения, но, по словам RFC 7230, «это было признано непрактичным для многих приложений ... вместо этого ... будьте осторожны при открытии нескольких соединений».Эти рекомендации предназначены для улучшения времени ответа HTTP и предотвращения перегрузки.Если HTTP-конвейеризация реализована правильно, то при использовании дополнительных подключений выигрыш в производительности не будет достигнут, в то время как дополнительные подключения могут вызвать проблемы с перегрузкой

Недостатки:

Если клиентне закрывает соединение, когда все необходимые ему данные получены, ресурсы, необходимые для поддержания соединения на сервере, будут недоступны для других клиентов.Насколько это влияет на доступность сервера и как долго ресурсы недоступны, зависит от архитектуры и конфигурации сервера.

Итак, все еще на примере Python мы обычно используем оператор with, который автоматически обеспечивает закрытиесоединения с методом выхода после выполнения вложенного в блок кода.

Я думаю, что WinHttp имеет функциональность около настройки файлов cookie .Дополнительная информация о сеансе здесь .В то время как упоминает указателей на строку

lpszHeaders:

Указатель на строку, которая содержит дополнительные заголовки для добавления в запрос.Этот параметр может быть WINHTTP_NO_ADDITIONAL_HEADERS, еслинет дополнительных заголовков для добавления.

это не то, что я когда-либо пробовал.

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