Al usar el requests
módulo , ¿hay alguna forma de imprimir la solicitud HTTP sin procesar?
No quiero solo los encabezados, quiero la línea de solicitud, los encabezados y la impresión de contenido. ¿Es posible ver qué se construye a partir de la solicitud HTTP?
python
http
python-requests
huggie
fuente
fuente
requests
característica, ya que significaría reescribir / omitirurllib3
yhttplib
. Vea el seguimiento de la pila a continuaciónRespuestas:
Desde v1.2.3 Requests agregó el objeto PreparedRequest. Según la documentación "contiene los bytes exactos que se enviarán al servidor".
Uno puede usar esto para imprimir una solicitud, así:
que produce:
Luego puede enviar la solicitud real con esto:
Estos enlaces son a la última documentación disponible, por lo que pueden cambiar en contenido: Avanzado - Solicitudes preparadas y API - Clases de nivel inferior
fuente
requests
es sencilla, así que creo que esta debería ser la respuesta aceptadaresponse = requests.post(...)
(orequests.get
, orequests.put
los métodos, etc.), en realidad se puede obtener elPreparedResponse
medioresponse.request
. Puede guardar el trabajo de manipulación manualrequests.Request
yrequests.Session
, si no necesita acceder a los datos http sin procesar antes de recibir una respuesta.Estoy usando solicitudes versión 2.18.4 y Python 3
fuente
Nota: esta respuesta está desactualizada. Las versiones más recientes de
requests
apoyo para conseguir el contenido solicitud directamente, como la respuesta de AntonioHerraizS documentos .No es posible obtener el verdadero contenido sin procesar de la solicitud
requests
, ya que solo trata con objetos de nivel superior, como encabezados y tipo de método .requests
usosurllib3
para enviar peticiones, perourllib3
también no se ocupa de los datos en bruto - que utilizahttplib
. Aquí hay un seguimiento representativo de la pila de una solicitud:Dentro de la
httplib
maquinaria, podemos verHTTPConnection._send_request
usos indirectosHTTPConnection._send_output
, que finalmente crean la solicitud sin procesar y el cuerpo (si existe), y los utilizaHTTPConnection.send
para enviarlos por separado.send
Finalmente llega al zócalo.Como no hay ganchos para hacer lo que quieres, como último recurso, puedes usar parches
httplib
para obtener el contenido. Es una solución frágil, y es posible que deba adaptarla sihttplib
se cambia. Si tiene la intención de distribuir software usando esta solución, puede considerar el empaquetado enhttplib
lugar de usar el sistema, lo cual es fácil, ya que es un módulo de Python puro.Por desgracia, sin más preámbulos, la solución:
que produce la salida:
fuente
patch_send
varias veces, solo una vez, después de importarhttplib
Una idea aún mejor es utilizar la biblioteca request_toolbelt, que puede volcar tanto las solicitudes como las respuestas como cadenas para que pueda imprimir en la consola. Maneja todos los casos difíciles con archivos y codificaciones que la solución anterior no maneja bien.
Es tan fácil como esto:
Fuente: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Simplemente puede instalarlo escribiendo:
fuente
Aquí hay un código, que hace lo mismo, pero con encabezados de respuesta:
Pasé mucho tiempo buscando esto, así que lo dejo aquí, si alguien lo necesita.
fuente
Yo uso la siguiente función para formatear solicitudes. Es como @AntonioHerraizS, excepto que también imprimirá bonitos objetos JSON en el cuerpo y etiquetará todas las partes de la solicitud.
Y tengo una función similar para formatear la respuesta:
fuente
requests
admite los llamados ganchos de eventos (a partir de 2.23 en realidad solo hayresponse
ganchos). El enlace se puede usar en una solicitud para imprimir los datos completos del par solicitud-respuesta, incluyendo URL, encabezados y cuerpos efectivos, como:Ejecutarlo imprime:
Es posible que desee cambiar
res.text
ares.content
si la respuesta es binaria.fuente