2017-01-14 5 views
1

У нас есть сервер, содержащий файлы .txt, в основном некоторые файлы журналов, растущие с течением времени. Когда я использую urllib2 для отправки GET на сервер r = urllib2.urlopen('http://example.com'), заголовки ответа будет:Запросы Python и urllib2 получают разные заголовки при подключении к одному и тому же хосту

Date: XXX 
Server: Apache 
Last-Modified: XXX 
Accept-Ranges: bytes 
Content-Length: 12345678 
Vary: Accept-Encoding 
Connection: close 
Content-Type: text/plain 

Хотя если r = requests.get('http://example.com'):

Content-Encoding: gzip 
Accept-Ranges: bytes 
Vary: Accept-Encoding 
Keep-alive: timeout=5, max=128 
Last-Modified: XXX 
Connection: Keep-Alive 
ETag: xxxxxxxxx 
Content-Type: text/plain 

Второй ответ то же самое с тем, что я получаю, используя хром разработать инструменты. Так почему же они разные? Мне нужен заголовок , чтобы определить, сколько байтов мне нужно загружать каждый раз, потому что файл может расти очень большой.

EDIT: Использование httpbin.org/get для теста:

urllib2 ответа:

{u'args': {}, 
u'headers': {u'Accept-Encoding': u'identity', 
       u'Host': u'httpbin.org', 
       u'User-Agent': u'Python-urllib/2.7'}, 
u'origin': u'ip', 
u'url': u'http://httpbin.org/get'} 

ответ заголовки:

Server: nginx 
Date: Sat, 14 Jan 2017 07:41:16 GMT 
Content-Type: application/json 
Content-Length: 207 
Connection: close 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Credentials: true 

запрашивает ответ:

{u'args': {}, 
u'headers': {u'Accept': u'*/*', 
       u'Accept-Encoding': u'gzip, deflate', 
       u'Host': u'httpbin.org', 
       u'User-Agent': u'python-requests/2.11.1'}, 
u'origin': u'ip', 
u'url': u'http://httpbin.org/get'} 

заголовки ответа:

Server : nginx 
Date : Sat, 14 Jan 2017 07:42:39 GMT 
Content-Type : application/json 
Content-Length : 239 
Connection : keep-alive 
Access-Control-Allow-Origin : * 
Access-Control-Allow-Credentials : true 
+1

Есть _sending_ те же заголовки в каждом случае? – snakecharmerb

+0

Вы уверены, что услуга, которую вы достигаете, не повреждена? Поскольку это корпоративная услуга, возможно, кто-то ошибся, и существует несколько разных веб-серверов под одним и тем же виртуальным IP-адресом? Если вы попытаетесь обновить (CTRL + F5) в хроме, вы последовательно получаете тот же ответ? – iTayb

+0

@snakecharmerb Привет, да, сервер требует базового auth. В urllib2 я вручную добавляю «Авторизация»: «Базовый XXX», а в запросах я использую request.get ('url', auth = ('user', 'password')). Все остальные настройки по умолчанию. – dofine

ответ

1

цитата из Lukasa на GitHub:

Ответ отличается тем, что запросы указывает, что он поддерживает GZIP закодированный тела, путем отправки Accept-Encoding: GZIP, выкачать поле заголовка. urllib2 - нет. Вы найдете, добавили ли вы заголовок в свой запрос urllib2, чтобы вы получили новое поведение.

Очевидно, что в этом случае сервер динамически gzipping ответы . Это означает, что он не знает, как долго ответ будет, , поэтому он отправляется с использованием кодированной передачи.

Если вы действительно должны получить заголовок Content-Length, то вы должны добавить следующие заголовки в запрос на запрос: {'Accept-Encoding': 'identity'}.

 Смежные вопросы

  • Нет связанных вопросов^_^