¿Cómo puedo ver la solicitud HTTP completa que envía mi aplicación Python?
En mi caso, estoy usando la requests
biblioteca para llamar a la API de PayPal a través de HTTPS. Lamentablemente, recibo un error de PayPal y el soporte técnico de PayPal no puede determinar cuál es el error ni cuál es su causa. Quieren que "proporcione la solicitud completa, incluidos los encabezados".
¿Cómo puedo hacer eso?
Un método simple: habilite el inicio de sesión en versiones recientes de Solicitudes (1.x y superiores).
Requests utiliza la configuración del módulo http.client
y logging
para controlar la detalle del registro, como se describe aquí .
Demostración
Código extraído de la documentación vinculada:
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')
Salida de ejemplo
$ 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
r = requests.get('https://api.github.com', auth=('user', 'pass'))
r
es una respuesta. Tiene un atributo de solicitud que tiene la información que necesita.
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
da los encabezados:
{'Accept': '*/*',
'Accept-Encoding': 'identity, deflate, compress, gzip',
'Authorization': u'Basic dXNlcjpwYXNz',
'User-Agent': 'python-requests/0.12.1'}
Luego r.request.data
tiene el cuerpo como mapeo. Puedes convertir esto con urllib.urlencode
si lo prefieren:
import urllib
b = r.request.data
encoded_body = urllib.urlencode(b)
Dependiendo del tipo de respuesta, .data
es posible que falte el atributo y .body
que en su lugar haya un atributo.