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
utilisations urllib3
à envoyer des demandes, mais urllib3
aussi ne traite pas des données brutes - il utilise httplib
. Voici une trace de pile représentative d'une demande:
-> r= requests.get("http://google.com")
/usr/local/lib/python2.7/dist-packages/requests/api.py(55)get()
-> return request('get', url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/api.py(44)request()
-> return session.request(method=method, url=url, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(382)request()
-> resp = self.send(prep, **send_kwargs)
/usr/local/lib/python2.7/dist-packages/requests/sessions.py(485)send()
-> r = adapter.send(request, **kwargs)
/usr/local/lib/python2.7/dist-packages/requests/adapters.py(324)send()
-> timeout=timeout
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(478)urlopen()
-> body=body, headers=headers)
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py(285)_make_request()
-> conn.request(method, url, **httplib_request_kw)
/usr/lib/python2.7/httplib.py(958)request()
-> self._send_request(method, url, body, headers)
À l'intérieur de la httplib
machine, nous pouvons voir HTTPConnection._send_request
indirectement les utilisations HTTPConnection._send_output
, ce qui crée finalement la requête brute et le corps (s'il existe), et les utilise HTTPConnection.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 de httplib
changement. Si vous avez l'intention de distribuer des logiciels à l'aide de cette solution, vous voudrez peut-être envisager d'empaqueter httplib
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:
import requests
import httplib
def patch_send():
old_send= httplib.HTTPConnection.send
def new_send( self, data ):
print data
return old_send(self, data) #return is not necessary, but never hurts, in case the library is changed
httplib.HTTPConnection.send= new_send
patch_send()
requests.get("http://www.python.org")
ce qui donne la sortie:
GET / HTTP/1.1
Host: www.python.org
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/2.1.0 CPython/2.7.3 Linux/3.2.0-23-generic-pae