Catatan: jawaban ini sudah usang. Versi requests
dukungan yang lebih baru mendapatkan konten permintaan secara langsung, seperti dokumen jawaban AntonioHerraizS .
Tidak mungkin mendapatkan konten mentah yang benar dari permintaan requests
, karena hanya berurusan dengan objek tingkat yang lebih tinggi, seperti header dan tipe metode . requests
digunakan urllib3
untuk mengirim permintaan, tetapi urllib3
juga tidak berurusan dengan data mentah - yang digunakan httplib
. Berikut ini jejak tumpukan representatif dari suatu permintaan:
-> 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)
Di dalam httplib
mesin, kita dapat melihat HTTPConnection._send_request
penggunaan tidak langsung HTTPConnection._send_output
, yang akhirnya membuat permintaan dan isi mentah (jika ada), dan menggunakan HTTPConnection.send
untuk mengirimkannya secara terpisah. send
akhirnya mencapai soket.
Karena tidak ada kaitan untuk melakukan apa yang Anda inginkan, sebagai upaya terakhir Anda dapat menambal monyet httplib
untuk mendapatkan konten. Ini adalah solusi yang rapuh, dan Anda mungkin perlu menyesuaikannya jika httplib
diubah. Jika Anda bermaksud untuk mendistribusikan perangkat lunak menggunakan solusi ini, Anda mungkin ingin mempertimbangkan kemasan httplib
daripada menggunakan sistem, yang mudah, karena ini adalah modul python murni.
Sayangnya, tanpa basa-basi, solusinya:
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")
yang menghasilkan output:
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