WinHTTPRequest возвращает пустой текст и тело ответа

У меня возникли проблемы с получением текста ответа и тела ответа, когда я запускаю приведенный ниже код. Сообщение «HTTP/1.1 200 OK» возвращается вместе с заголовками ответа, но без тела ответа. Я подтвердил этот результат, используя Fiddler2, а также просматривая журнал трассировки netsh.

Другие URL-адреса (http://real-chart.finance.yahoo.com/table.csv?s=CELG&d=6&e=26&f=2014&g=d&a=2&b=26&c=1990&ignore=.csv), например, do возвращает текст ответа, а также тело ответа.

Почему возникла проблема с этим URL-адресом и как я могу заставить его возвращать тело ответа?

Sub testlogin()

    fileUrl = "http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=XNYS:HFC&region=USA&culture=en-US&productCode=COM&reportType=is&period=&dataType=A&order=desc&columnYear=5&rounding=3&view=raw"

    Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")

    WHTTP.Open "GET", fileUrl, False

    WHTTP.Send

    MsgBox WHTTP.Status
    MsgBox WHTTP.ResponseText
    MsgBox WHTTP.ResponseBody
    MsgBox WHTTP.GetAllResponseHeaders

    Set WHTTP = Nothing

End Sub

person Osprey2k    schedule 26.07.2014    source источник


Ответы (1)


Вы изучили те заголовки ответов, которые возвращаются вызовами GET для обоих URL-адресов?

Morningstar выглядит следующим образом:

Cache-Control: max-age=0
Connection: keep-alive
Date: Sat, 26 Jul 2014 22:07:33 GMT
Pragma: no-cache
Content-Length: 0
===>> Content-Type: text/html;charset=UTF-8 <<===
===>> Content-Encoding: gzip <<===
Server: Apache
Set-Cookie: JSESSIONID=6FAF41A612ABB32B0C670AB07BF0D8A5; HttpOnly
Vary: User-Agent
Vary: Accept-Encoding
com.coradiant.appvis: vid=ad&sid=CONTROLLER_1&tid=da615c36-2a18-4129-bcd7-1cbb139ab52b
Content-Disposition: attachment;filename=""HFC Income Statement.csv""
ExpiresDefault: access plus 2 hours

Yahoo Finance выглядит следующим образом:

Cache-Control: private
Connection: close
Date: Sat, 26 Jul 2014 22:10:00 GMT
Transfer-Encoding: chunked
===>> Content-Type: text/csv <<===
P3P: policyref=""http://info.yahoo.com/w3c/p3p.xml"", CP=""CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV""
Set-Cookie: B=d3svnbl9t89po&b=3&s=4i; expires=Tue, 26-Jul-2016 22:10:00 GMT; path=/; domain=.yahoo.com
Vary: Accept-Encoding

Я как бы выделил заголовки Content-Type и Content-Encoding (где они доступны).

По сути, возвращаемый контент отличается для двух вызовов. Ясно, что Excel может интерпретировать второй случай, когда тип содержимого — «text/csv», но первый — это странная сжатая html-страница, которую, я думаю, Excel не может понять.

Я не могу дать вам решение этой проблемы, но содержание заголовков, безусловно, может объяснить разницу в поведении, которую вы видите.

person djikay    schedule 26.07.2014
comment
спасибо за упоминание о просмотре заголовков. Я попытался поиграть с заголовками запросов, чтобы увидеть, смогу ли я настроить сервер Morningstar, но без особого успеха. Что интересно, я вижу, где WinHTTPRequest имеет заголовки по умолчанию, которые он передает (я вижу это в Fiddler2), которые при отправке Fiddler напрямую возвращают результаты. Кажется, в WinHTTPRequest есть что-то особенное, кроме отправляемых им заголовков, которые не работают с сервером Morningstar. - person Osprey2k; 27.07.2014
comment
@ Osprey2k: Возможно, он просто не обрабатывает/не понимает сжатый gzip-контент и просто игнорирует его. Я не могу быть уверен, я не работал с ним достаточно или в каких-то больших деталях. - person djikay; 27.07.2014
comment
Я думаю, вы правы... несколько поисковых запросов в Google показали, что WinHTTP и XMLHTTP не поддерживают сжатие gzip. Думаю, мне придется найти другой способ загрузки CSV-файлов с Morningstar. Я знаю, что могу использовать URLDownloadToFile, мне просто нужно научиться использовать его с защищенным паролем сайтом. Спасибо за помощь. - person Osprey2k; 27.07.2014
comment
@ Osprey2k: Добро пожаловать. Надеюсь разберетесь, удачи! - person djikay; 27.07.2014