it-swarm.com.de

Wie kann ich die gesamte HTTP-Anforderung anzeigen, die von meiner Python -Anwendung gesendet wird?

In meinem Fall verwende ich die Bibliothek requests, um die Paypal-API über HTTPS aufzurufen. Leider bekomme ich einen Fehler von Paypal und der Paypal-Support kann nicht herausfinden, was der Fehler ist oder was ihn verursacht. Sie möchten, dass ich "Bitte geben Sie die gesamte Anfrage an, einschließlich der Überschriften".

Wie kann ich das machen?

221
Chris B.

Eine einfache Methode: Aktivieren Sie die Protokollierung in neueren Versionen von Requests (1.x und höher).

Requests verwendet das http.client und logging Modulkonfiguration zur Steuerung der Ausführlichkeit der Protokollierung, wie beschrieben hier .

Demonstration

Code aus der verlinkten Dokumentation:

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')

Beispielausgabe

$ 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 ist eine Antwort. Es verfügt über ein Anforderungsattribut, das die von Ihnen benötigten Informationen enthält.

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 gibt die Überschriften:

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

Dann r.request.data hat den Body als Mapping. Sie können dies mit urllib.urlencode wenn sie es vorziehen:

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

abhängig von der art der antwort die .data- Attribut fehlt möglicherweise und ein .body- Attribut stattdessen da sein.

119
Skylar Saveland

Wenn Sie Python 2.x verwenden, versuchen Sie, einen rllib2 - Öffner zu installieren. Dadurch sollten Ihre Header ausgedruckt werden, obwohl Sie dies möglicherweise mit anderen Öffnern kombinieren müssen verwenden, um das HTTPS zu schlagen.

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

Mit der Konfigurationsoption verbose können Sie möglicherweise sehen, was Sie möchten. Es gibt ein Beispiel in der Dokumentation .

HINWEIS: Lesen Sie die folgenden Kommentare: Die ausführlichen Konfigurationsoptionen scheinen nicht mehr verfügbar zu sein.

3
Bruno

Sie können HTTP Toolkit verwenden, um genau dies zu tun.

Dies ist besonders nützlich, wenn Sie dies schnell und ohne Codeänderungen tun müssen: Sie können ein Terminal über das HTTP-Toolkit öffnen, einen beliebigen Python Code wie gewohnt von dort aus ausführen, und Sie werden in der Lage sein sehen Sie sofort den vollständigen Inhalt jeder HTTP/HTTPS-Anfrage.

Es gibt eine kostenlose Version, die alles kann, was Sie brauchen, und sie ist zu 100% Open Source.

Ich bin der Schöpfer des HTTP-Toolkits. Ich habe es tatsächlich selbst gebaut, um genau dasselbe Problem für mich zu lösen! Auch ich habe versucht, eine Zahlungsintegration zu debuggen, aber das SDK funktionierte nicht, ich konnte nicht sagen warum, und ich musste wissen, was tatsächlich vor sich ging, um es richtig zu beheben. Es ist sehr frustrierend, aber es hilft wirklich, den rohen Verkehr zu sehen.

2
Tim Perry