web-dev-qa-db-fra.com

Comment voir l'intégralité de la requête HTTP envoyée par mon application Python?

Dans mon cas, j'utilise la bibliothèque requests pour appeler l'API de Paypal via HTTPS. Malheureusement, je reçois une erreur de Paypal, et le support de Paypal ne peut pas déterminer quelle est l'erreur ou quelle en est la cause. Ils veulent que je "Merci de fournir l'intégralité de la demande, en-têtes inclus".

Comment puis je faire ça?

221
Chris B.

Une méthode simple: activer la journalisation dans les versions récentes de Requests (1.x et versions ultérieures.)

Requests utilise les configurations de module http.client et logging pour contrôler la verbosité de la journalisation, comme décrit ici .

Manifestation

Code extrait de la documentation liée:

import requests
import logging

# These two lines enable debugging at httplib level (requests->urllib3->http.client)
# You will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# The only thing missing will be the response.body which is not logged.
try:
    import http.client as http_client
except ImportError:
    # Python 2
    import httplib as http_client
http_client.HTTPConnection.debuglevel = 1

# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

requests.get('https://httpbin.org/headers')

Exemple de sortie

$ python requests-logging.py 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): httpbin.org
send: 'GET /headers HTTP/1.1\r\nHost: httpbin.org\r\nAccept-Encoding: gzip, deflate, compress\r\nAccept: */*\r\nUser-Agent: python-requests/1.2.0 CPython/2.7.3 Linux/3.2.0-48-generic\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: application/json
header: Date: Sat, 29 Jun 2013 11:19:34 GMT
header: Server: gunicorn/0.17.4
header: Content-Length: 226
header: Connection: keep-alive
DEBUG:requests.packages.urllib3.connectionpool:"GET /headers HTTP/1.1" 200 226
437
Inactivist
r = requests.get('https://api.github.com', auth=('user', 'pass'))

r est une réponse. Il possède un attribut de requête qui contient les informations dont vous avez besoin.

r.request.allow_redirects  r.request.headers          r.request.register_hook
r.request.auth             r.request.hooks            r.request.response
r.request.cert             r.request.method           r.request.send
r.request.config           r.request.params           r.request.sent
r.request.cookies          r.request.path_url         r.request.session
r.request.data             r.request.prefetch         r.request.timeout
r.request.deregister_hook  r.request.proxies          r.request.url
r.request.files            r.request.redirect         r.request.verify

r.request.headers donne les en-têtes:

{'Accept': '*/*',
 'Accept-Encoding': 'identity, deflate, compress, gzip',
 'Authorization': u'Basic dXNlcjpwYXNz',
 'User-Agent': 'python-requests/0.12.1'}

Alors r.request.data a le corps en tant que mapping. Vous pouvez convertir ceci avec urllib.urlencode s'ils préfèrent:

import urllib
b = r.request.data
encoded_body = urllib.urlencode(b)

en fonction du type de réponse, l'attribut .data- peut être manquant et un attribut .body- est présent.

119
Skylar Saveland

Si vous utilisez Python 2.x, essayez d'installer un ouvreur rllib2 . Cela devrait imprimer vos en-têtes, bien que vous deviez peut-être le combiner avec d'autres ouvreurs que vous utilisez pour utiliser le protocole HTTPS.

import urllib2
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)))
urllib2.urlopen(url)
5
Kafonek

L'option de configuration verbose peut vous permettre de voir ce que vous voulez. Il y a n exemple dans la documentation .

NOTE: Lisez les commentaires ci-dessous: Les options de configuration détaillée ne semblent plus disponibles.

3
Bruno

Vous pouvez utiliser HTTP Toolkit pour faire exactement cela.

Cela est particulièrement utile si vous devez le faire rapidement, sans modification de code: vous pouvez ouvrir un terminal à partir de HTTP Toolkit, exécuter n'importe quel code Python à partir de cet emplacement, et vous pourrez voir le plein contenu de chaque demande HTTP/HTTPS immédiatement.

Il existe une version gratuite qui peut faire tout ce dont vous avez besoin, et elle est 100% open source.

Je suis le créateur de HTTP Toolkit; En fait, je l'ai construit moi-même pour résoudre exactement le même problème pour moi il y a quelque temps! Moi aussi, j'essayais de déboguer une intégration de paiement, mais leur SDK ne fonctionnait pas, je ne savais pas pourquoi, et j'avais besoin de savoir ce qui se passait réellement pour le réparer correctement. C'est très frustrant, mais être capable de voir le trafic brut aide vraiment.

2
Tim Perry