Saat menggunakan requests
modul , apakah ada cara untuk mencetak permintaan HTTP mentah?
Saya tidak ingin hanya header, saya ingin baris permintaan, header, dan cetakan konten. Apakah mungkin untuk melihat apa yang akhirnya dibangun dari permintaan HTTP?
python
http
python-requests
Huggie
sumber
sumber
requests
fitur, karena itu berarti penulisan ulang / bypassurllib3
danhttplib
. Lihat jejak tumpukan di bawah iniJawaban:
Sejak v1.2.3 Permintaan menambahkan objek PreparedRequest. Sesuai dokumentasi "itu berisi byte yang tepat yang akan dikirim ke server".
Orang dapat menggunakan ini untuk mencetak permintaan, seperti:
yang menghasilkan:
Kemudian Anda dapat mengirim permintaan aktual dengan ini:
Tautan-tautan ini menuju ke dokumentasi terbaru yang tersedia, sehingga dapat berubah konten: Lanjutan - Permintaan yang disiapkan dan API - Kelas tingkat bawah
sumber
requests
itu mudah, jadi saya pikir ini harus menjadi jawaban yang diterimaresponse = requests.post(...)
(ataurequests.get
ataurequests.put
, dll) metode, Anda benar-benar bisa mendapatkanPreparedResponse
melaluiresponse.request
. Ini dapat menyimpan pekerjaan memanipulasi secara manualrequests.Request
danrequests.Session
, jika Anda tidak perlu mengakses data http mentah sebelum Anda menerima tanggapan.Saya menggunakan permintaan versi 2.18.4 dan Python 3
sumber
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
digunakanurllib3
untuk mengirim permintaan, tetapiurllib3
juga tidak berurusan dengan data mentah - yang digunakanhttplib
. Berikut ini jejak tumpukan representatif dari suatu permintaan:Di dalam
httplib
mesin, kita dapat melihatHTTPConnection._send_request
penggunaan tidak langsungHTTPConnection._send_output
, yang akhirnya membuat permintaan dan isi mentah (jika ada), dan menggunakanHTTPConnection.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 jikahttplib
diubah. Jika Anda bermaksud untuk mendistribusikan perangkat lunak menggunakan solusi ini, Anda mungkin ingin mempertimbangkan kemasanhttplib
daripada menggunakan sistem, yang mudah, karena ini adalah modul python murni.Sayangnya, tanpa basa-basi, solusinya:
yang menghasilkan output:
sumber
patch_send
berkali-kali, hanya sekali, setelah mengimporhttplib
Gagasan yang bahkan lebih baik adalah dengan menggunakan perpustakaan request_toolbelt, yang dapat membuang permintaan dan tanggapan sebagai string bagi Anda untuk mencetak ke konsol. Ini menangani semua kasus rumit dengan file dan pengkodean yang tidak ditangani dengan baik oleh solusi di atas.
Semudah ini:
Sumber: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Anda cukup menginstalnya dengan mengetik:
sumber
Berikut adalah kode, yang membuatnya sama, tetapi dengan header respons:
Saya menghabiskan banyak waktu mencari ini, jadi saya meninggalkannya di sini, jika seseorang membutuhkan.
sumber
Saya menggunakan fungsi berikut untuk memformat permintaan. Ini seperti @AntonioHerraizS kecuali itu akan cukup mencetak objek JSON di dalam tubuh juga, dan label semua bagian dari permintaan.
Dan saya memiliki fungsi serupa untuk memformat respons:
sumber
requests
mendukung yang disebut kait acara (pada 2.23 sebenarnya hanya adaresponse
kait). Pengait dapat digunakan berdasarkan permintaan untuk mencetak data pasangan permintaan-respons penuh, termasuk URL, tajuk, dan badan yang efektif, seperti:Menjalankannya mencetak:
Anda mungkin ingin mengubah
res.text
keres.content
jika responsnya adalah biner.sumber