¿Cómo puedo ver la solicitud HTTP completa que envía mi aplicación Python?

Resuelto Chris B. asked hace 12 años • 9 respuestas

En mi caso, estoy usando la requestsbiblioteca 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?

Chris B. avatar May 15 '12 01:05 Chris B.
Aceptado

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.clienty loggingpara 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
Inactivist avatar May 19 '2013 02:05 Inactivist
r = requests.get('https://api.github.com', auth=('user', 'pass'))

res 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.headersda los encabezados:

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

Luego r.request.datatiene el cuerpo como mapeo. Puedes convertir esto con urllib.urlencodesi lo prefieren:

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

Dependiendo del tipo de respuesta, .dataes posible que falte el atributo y .bodyque en su lugar haya un atributo.

Skylar Saveland avatar May 14 '2012 18:05 Skylar Saveland