web-dev-qa-db-fra.com

Comment imprimer l'entête http-response en Python

Aujourd'hui, je devais récupérer les données de la réponse en-tête http. Mais comme je ne l’ai jamais fait auparavant et qu’il n’ya pas grand-chose que vous puissiez trouver sur Google à ce sujet. J'ai décidé de poser ma question ici.

Question actuelle: comment imprimer les données de réponse de l'en-tête http en python? Je travaille dans Python3.5 avec le module de demandes et je n'ai pas encore trouvé le moyen de le faire.

4
Naomi

Que diriez-vous quelque chose comme ça:

import urllib2
req = urllib2.Request('http://www.google.com/')
res = urllib2.urlopen(req)
print res.info()
res.close();

Si vous recherchez quelque chose de spécifique dans l'en-tête:

For Date: print res.info().get('Date')
6
NepCoder

Update : Selon le commentaire de OP, seuls les en-têtes de réponse sont nécessaires. Encore plus facile comme écrit dans la documentation du module Requests ci-dessous:

Nous pouvons afficher les en-têtes de réponse du serveur à l'aide d'un dictionnaire Python:

>>> r.headers
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json'
}

Et surtout les notes de documentation:

Le dictionnaire est spécial, cependant: il est fait uniquement pour les en-têtes HTTP. Selon la RFC 7230, les noms d'en-tête HTTP ne respectent pas la casse.

Nous pouvons donc accéder aux en-têtes à l'aide de la capitalisation souhaitée:

et continue en expliquant encore plus astucieux concernant la conformité RFC.

La demande la documentation indique:

Utiliser Response.iter_content gérera beaucoup de ce que vous auriez autrement à gérer si vous utilisez directement Response.raw. Lorsque vous transférez un téléchargement, la procédure ci-dessus est la méthode recommandée pour récupérer le contenu.

Il offre comme exemple:

>>> r = requests.get('https://api.github.com/events', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

Mais offre également des conseils pratiques sur la manière de le faire en redirigeant vers un fichier, etc. et en utilisant une méthode différente:

Utiliser Response.iter_content gérera beaucoup de ce que vous auriez autrement à gérer si vous utilisez Response.raw directement

4
Dilettant

Essayez d'utiliser req.headers et c'est tout. Vous obtiendrez les en-têtes de réponse;)

1
Utkarsh Agrawal

J'utilise le module urllib, avec le code suivant:

from urllib import request
with request.urlopen(url, data) as f:
    print(f.getcode())  # http response code
    print(f.info())     # all header info

    resp_body = f.read().decode('utf-8') # response body
1
Kevin Liu

facile

import requests

site = "https://www.google.com"
headers = requests.get(site).headers
print(headers)

si vous voulez quelque chose de spécifique

print(headers["domain"]) 
0
J0KER11