Lors de l'utilisation du requests
module , existe-t-il un moyen d'imprimer la requête HTTP brute?
Je ne veux pas seulement les en-têtes, je veux la ligne de demande, les en-têtes et l'impression de contenu. Est-il possible de voir ce qui est finalement construit à partir d'une requête HTTP?
python
http
python-requests
huggie
la source
la source
requests
fonctionnalité, car cela signifierait réécriture / contournementurllib3
ethttplib
. Voir la trace de la pile ciRéponses:
Depuis la v1.2.3, les requêtes ont ajouté l'objet PreparedRequest. Selon la documentation "il contient les octets exacts qui seront envoyés au serveur".
On peut l'utiliser pour imprimer une jolie requête, comme ceci:
qui produit:
Ensuite, vous pouvez envoyer la demande réelle avec ceci:
Ces liens sont vers la dernière documentation disponible, ils peuvent donc changer de contenu: Avancé - Demandes préparées et API - Classes de niveau inférieur
la source
requests
est simple, donc je pense que cela devrait devenir la réponse acceptéeresponse = requests.post(...)
(ourequests.get
ourequests.put
, etc.), vous pouvez réellement passer auPreparedResponse
traversresponse.request
. Il peut économiser le travail de manipulation manuellerequests.Request
etrequests.Session
, si vous n'avez pas besoin d'accéder aux données http brutes avant de recevoir une réponse.J'utilise les requêtes version 2.18.4 et Python 3
la source
Remarque: cette réponse est obsolète. Les nouvelles versions de
requests
soutien obtenir le contenu de la demande directement, en tant que réponse de AntonioHerraizS documents .Il n'est pas possible d'extraire le véritable contenu brut de la demande
requests
, car il ne traite que des objets de niveau supérieur, tels que les en- têtes et le type de méthode .requests
utilisationsurllib3
à envoyer des demandes, maisurllib3
aussi ne traite pas des données brutes - il utilisehttplib
. Voici une trace de pile représentative d'une demande:À l'intérieur de la
httplib
machine, nous pouvons voirHTTPConnection._send_request
indirectement les utilisationsHTTPConnection._send_output
, ce qui crée finalement la requête brute et le corps (s'il existe), et les utiliseHTTPConnection.send
pour les envoyer séparément.send
atteint enfin la prise.Puisqu'il n'y a pas d'hameçons pour faire ce que vous voulez, en dernier recours, vous pouvez réparer les singes
httplib
pour obtenir le contenu. C'est une solution fragile et vous devrez peut-être l'adapter en cas dehttplib
changement. Si vous avez l'intention de distribuer des logiciels à l'aide de cette solution, vous voudrez peut-être envisager d'empaqueterhttplib
au lieu d'utiliser le système, ce qui est facile, car il s'agit d'un module python pur.Hélas, sans plus tarder, la solution:
ce qui donne la sortie:
la source
patch_send
plusieurs fois, une seule fois, après l'importationhttplib
Une meilleure idée consiste à utiliser la bibliothèque requests_toolbelt, qui peut vider les demandes et les réponses sous forme de chaînes à imprimer sur la console. Il gère tous les cas délicats avec des fichiers et des encodages que la solution ci-dessus ne gère pas bien.
C'est aussi simple que cela:
Source: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Vous pouvez simplement l'installer en tapant:
la source
Voici un code qui fait la même chose, mais avec des en-têtes de réponse:
J'ai passé beaucoup de temps à chercher cela, donc je le laisse ici, si quelqu'un a besoin.
la source
J'utilise la fonction suivante pour formater les demandes. C'est comme @AntonioHerraizS, sauf qu'il imprimera également les objets JSON dans le corps et étiqueter toutes les parties de la demande.
Et j'ai une fonction similaire pour formater la réponse:
la source
requests
prend en charge les soi-disant hooks d'événements (à partir de la version 2.23, il n'y a en fait que des hooksresponse
). Le hook peut être utilisé sur une demande pour imprimer les données complètes de la paire demande-réponse, y compris l'URL effective, les en-têtes et les corps, comme:L'exécuter imprime:
Vous voudrez peut - être changer
res.text
deres.content
si la réponse est binaire.la source