1 (изменено: matiz, 2010-10-22 22:18:12)

Тема: VBA: MSXML2.XMLHTTP: множественные запросы

Здравствуйте, уважаемые. Написал макрос в Excel, который отправляет данные на страницу сайта методом POST:

Dim XMLHTTP As MSXML2.XMLHTTP, step as Integer, flag As Boolean
Set XMLHTTP = New MSXML2.XMLHTTP
step = 1: flag = True
Do
    XMLHTTP.Open "POST", "http://www.site.ru/page.php?val=1", True
    XMLHTTP.SetRequestHeader "Host", "http://www.site.ru"
    XMLHTTP.SetRequestHeader "Content-type", "application/x-www-form-urlencoded"
    XMLHTTP.SetRequestHeader "Cache-Control", "no-store, no-cache"
    XMLHTTP.SetRequestHeader "Pragma", "no-cache"
    XMLHTTP.SetRequestHeader "User-agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)"
    zapros = ""
    ' далее в zapros формируются данные, количество символов примерно 250000
    XMLHTTP.SetRequestHeader "Content-Length", CStr(Len(zapros))
    XMLHTTP.send zapros
    Do While XMLHTTP.readyState <> 4
         DoEvents
    Loop
    step = step + 1
    If step > 10 Then flag = False
Loop Until flag = False
XMLHTTP.abort
Set XMLHTTP = Nothing

С запросами HTTP работаю первый раз, поэтому данный код предоставляю на "суд" - что лишнее в данном кода, что отсутствует, как можно оптимизировать и т.п.?. Передача данных осуществляется "крайне" долго, по сравнению с браузером. Конкретные вопросы отсутствуют, надеюсь, что при обсуждении появятся. Спасибо.

2

Re: VBA: MSXML2.XMLHTTP: множественные запросы

matiz пишет:

XMLHTTP.Open "POST", "http://www.site.ru/page.php?val=1", True

Вот здесь вот :
параметры при POST указывают только при Send, а не в URI. Может , долго по сравнению с браузером из-за ожидания XMLHTTP.readyState=4? Ведь браузер-то, вообще говоря, может начать показывать страницу и раньше.

А где формирование zapros ?

3

Re: VBA: MSXML2.XMLHTTP: множественные запросы

kefi пишет:

А где формирование zapros ?

Внутри цикла до отправки данных методом send. Данный код опущен и не информативен. В zapros примерно 250000 символов.
XMLHTTP.readyState=4 означает, что данные загружены. Браузер начинает при загрузке данных показывать их при значении равном 3 (получение данных). Хотя Вы меня навели на мысль, что отправка данных происходит быстро и большая часть времени тратится на загрузку ответа от сервера. В любом случае все действия, которые выполняются макросом я выполнял через браузер - намного быстрее. А дожидаюсь  полного ответа от сервера (readyState=4), чтобы "увидеть" правильность загрузки данных, не забивать трафик и не "напрягать" сервер.

4

Re: VBA: MSXML2.XMLHTTP: множественные запросы

2 matiz> Интересно, просто - повторяю, почему в URI указан параметр ?
XMLHTTP.Open "POST", "http://www.site.ru/page.php?val=1", True

5

Re: VBA: MSXML2.XMLHTTP: множественные запросы

kefi пишет:

2 matiz> Интересно, просто - повторяю, почему в URI указан параметр ?
XMLHTTP.Open "POST", "http://www.site.ru/page.php?val=1", True

Данный URI вымышленный, если Вы про это спрашиваете... Хотя, может и нет, ща проверю. Хм, доменное имя www.site.ru кем-то занято.
Если Вы не про это, то уточните вопрос или задайте его по-другому.

6

Re: VBA: MSXML2.XMLHTTP: множественные запросы

kefi, Вам большое спасибо! При отправке данных добавил специальный параметр, который "ограничивает" ответ от сервера. Время загрузки данных уменьшилась до приемлемой скорости.

7

Re: VBA: MSXML2.XMLHTTP: множественные запросы

2 matiz > Пожалуйста, конечно, только непонятно Вы изъясняетесь, я вот не понял , что Вы сделали .

8 (изменено: matiz, 2010-10-24 20:48:35)

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Вопрос: как можно при помощи VBA сжать информацию для передачи данных на сервер? Заранее известно, что сервер может принимать сжатую информацию - отправляет заголовки Accept-Encoding: gzip (или Accept-Encoding: deflate).

9

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Приветствую. Возникла новая проблема (задача). При использовании MSXML2.XMLHTTP в Excel полностью повторяю (моделирую) заголовки http-запроса браузера методом GET. Данные отправляются, ответ получаю - все нормально. Но при неких действиях на сервере данный запрос через браузер возвращает "обновленные" данные, а запрос через MSXML2.XMLHTTP в Excel возвращает все те же данные. Лечится это закрытием Excel-файла. Если его потом открыть и отправить запрос данные возвращаются "обновленными". Нужно исключить закрытие-открытие файла. Такое ощущение, что данные на клиенте кешируются (сохраняются). Но как? где? как их удалить?
По требованию могу попозже выложить код макроса.

10

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Кеширование. Вы правы. Каширование отключается отправкой дополнительного заголовка серверу - #8

oXMLHTTP.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 UTC")
( 2 * b ) || ! ( 2 * b )

11

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Кстати, НАсчет отключения кеширования может кто-ни ответить :
Почему часто советуют не этот метод , а отправку URL со случайной добавкой - что происходит в ээтом случае и как все-таки правильно?

12

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Оба метода хороши. Первым спосоом клиент говорит серверу вернуть данные позднее указанной даты. URL со случайной добавкой воспринимается сервером как уникальный запрос и полностью обрабатывает его. В результате данные поступают не из клиентского кеша, а прямо с сервера.

( 2 * b ) || ! ( 2 * b )

13

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Rumata, kefi Спасибо, об метода помогли.

14

Re: VBA: MSXML2.XMLHTTP: множественные запросы

Добрый день всем. В общем нужно заполнить поле на сайте из ячейки Excel методом POST и также учитываются cookie.
Привожу код запроса из chrom'a.


Remote Address:178.208.229.103:443
Request URL:https://crm-02.sotmarket.ru/modules/wms/router.php
Request Method:POST
Status Code:200 OK
Request Headers
:host:crm-02.sotmarket.ru
:method:POST
:path:/modules/wms/router.php
:scheme:https
:version:HTTP/1.1
accept:*/*
accept-encoding:gzip, deflate
accept-language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
content-length:113
content-type:application/x-www-form-urlencoded; charset=UTF-8
cookie:rSid=1414593791%3A51616; cart_cid=141459379131184; mag_cook_client=141459379131184; sClientId_real=n%2Fa; organic=2; p_o=42386112; tr=d; last_prod=957511%2C760781%2C810627%2C535479%2C475841%2C1169565%2C1575521%2C555815%2C555817%2C843549%2C1380335%2C1047351%2C691799%2C445483%2C16394%2C1958033%2C1174367%2C1116025%2C952047%2C1557421; gtm_ucn=true; _ga=GA1.2.1971897353.1417072338; __utma=28913251.1971897353.1417072338.1417072338.1417166665.2; __utmc=28913251; __utmz=28913251.1417072338.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); cart=empty; d_traf=25; ipzone=0-1-77-0-0-0; l=Lw%3D%3D; stm_stat_page_views=54; stm_stat_page_time=3043; __utma=190933496.1971897353.1417072338.1417171779.1417174236.3; __utmb=190933496.1.10.1417174236; __utmc=190933496; __utmz=190933496.1417169779.1.1.utmcsr=crm.sotmarket.ru|utmccn=(referral)|utmcmd=referral|utmcct=/; last_login=vasai; PHPSESSID=kum60
origin:https://crm-02.sotmarket.ru
referer:https://crm-02.sotmarket.ru/
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
x-newrelic-id:Uw4HWFZaGwYAUFRbAQc=
x-requested-with:XMLHttpRequest
Form Dataview sourceview URL encoded
movement_id:188067
action:wms/operationmovement/WMSOperationMovementUtils.getProductByBarcode
barcode:test123
Response Headers
cache-control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-encoding:gzip
content-type:text/html; charset=utf-8
date:Fri, 28 Nov 2014 11:59:52 GMT
expires:Thu, 19 Nov 1981 08:52:00 GMT
pragma:no-cache
server:nginx
status:200 OK
version:HTTP/1.1
x-newrelic-app-data:PxQAWVZaCAoTUVFWAggBUEYdFGQHBDcQUQxLA1tMXV1dORY0QwhvTQpTQAIUDhZAXxAMA0VaUhJKQ0NvTRYWAFwLWz4XV1hWb0pUDlUUXwcXahgWCxBkHEILFBZSQxkWDEEUH1JIU1IAUghOCBYEBAtWAU0cUB9AUg4PVFRQD1EDXQNXUVQGBUYdUFIOFQY/

В месте barcode вместо test123 должно передаваться 13-значное число. Помогите как это реализовать в vba.