Cara Melakukan Permintaan HTTP dengan Python - Bahagian 2 - Perpustakaan Permintaan
- 4029
- 1025
- Ronnie Hermann
Dalam artikel sebelumnya kita melihat bagaimana untuk melaksanakan permintaan HTTP asas menggunakan Perpustakaan Standard Python3. Apabila permintaan menjadi lebih kompleks, atau kami hanya mahu menggunakan kod yang kurang, dan kami tidak keberatan menambah kebergantungan kepada projek kami, mungkin (dan kadang -kadang disyorkan) untuk menggunakan luaran permintaan
modul. Perpustakaan, yang mengadopsi motto "HTTP untuk Manusia", akan menjadi tumpuan artikel ini.
Dalam tutorial ini anda akan belajar:
- Cara Melakukan Permintaan HTTP dengan Python3 dan Perpustakaan 'Permintaan'
- Cara Mengurus Respons Pelayan
- Cara bekerja dengan sesi
Permintaan HTTP dengan Python - PT. II: Perpustakaan Permintaan
Keperluan perisian dan konvensyen yang digunakan
Kategori | Keperluan, konvensyen atau versi perisian yang digunakan |
---|---|
Sistem | OS-bebas |
Perisian | Python3 dan Perpustakaan "Permintaan" |
Yang lain | Pengetahuan mengenai konsep asas pengaturcaraan berorientasikan objek dan python |
Konvensyen | # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak |
Melaksanakan permintaan dengan perpustakaan "Permintaan"
Di bahagian pertama siri ini, kami melakukan permintaan HTTP asas hanya menggunakan perpustakaan standard. Apabila permintaan menjadi lebih kompleks, contohnya apabila kita perlu memelihara kuki antara satu permintaan dan yang lain, kita boleh menggunakan permintaan
Perpustakaan luaran, yang memudahkan pekerjaan kami, melaksanakan banyak operasi di bawah tudung untuk kami. Oleh kerana perpustakaan tidak termasuk dalam pemasangan python3 lalai, kita mesti memasangnya pada sistem kita sebelum kita dapat menggunakannya. Kaedah bebas pengedaran untuk menyelesaikan tugas adalah dengan menggunakan Pip
, Pengurus Pakej Python:
Permintaan pemasangan $ pip3 -Pengguna
Sekarang kita memasang perpustakaan, mari kita lihat beberapa contoh cara menggunakannya.
Melakukan permintaan GET
Ingat permintaan yang kami buat menggunakan API NASA, untuk mengambil "imej hari" untuk tarikh tertentu? Membina dan menghantar permintaan yang sama dengan permintaan
Perpustakaan hanya memerlukan satu baris kod:
>>> permintaan import >>> respons = permintaan.Dapatkan ("https: // api.NASA.gov/planet/apod ", params = " api_key ":" demo_key "," tarikh ":" 2019-04-11 ")
Salinan Kami lulus URL dan parameter pertanyaan (masih sebagai kamus), masing -masing sebagai hujah pertama dan kedua Dapatkan
fungsi. Apa fungsi ini kembali? Ia mengembalikan contoh permintaan.model.Respons
kelas. Berinteraksi dengan contoh kelas ini sangat mudah. Adakah kita mahu mengambil kandungan JSON yang dikodkan dari respons? Mudah! kita hanya perlu memanggil json
kaedah objek:
>>> respons.json () 'date': '2019-04-11', 'Penjelasan': 'Apa yang kelihatan seperti lubang hitam? Untuk mengetahui, teleskop radio dari seluruh bumi menyelaraskan '' lubang hitam dengan ufuk acara terbesar di ' ... 'Segera sekitar lubang hitam di tengah galaksi kami' 'Milky Way.',' hdurl ':' https: // apod.NASA.Kerajaan/APOD/Imej/1904/M87BH_EHT_2629.jpg ',' media_type ':' imej ',' service_version ':' v1 ',' tajuk ':' imej skala cakrawala pertama dari lubang hitam ',' url ':' https: // apod.NASA.Kerajaan/APOD/Imej/1904/M87BH_EHT_960.jpg '
Salinan Adakah kita ingin mendapatkan respons pelayan sebagai rentetan? Yang harus kita lakukan ialah mengakses teks
harta:
respons.teks
Dengan cara yang sama kita boleh mengakses ke sebab
, status_code
dan tajuk
permintaan. Kami hanya perlu mengakses sifat masing -masing:
>>> respons.Sebab 'ok' >>> respons.status_code 200 >>> respons.Headers 'Server': 'OpenResty', 'Date': 'Thu, 18 Apr 2019 10:46:26 GMT', 'Kandungan-Jenis': 'Aplikasi/Json', 'Pemindahan-Pengekodan': 'Chunked', 'Sambungan': 'Keep-Alive', 'Vary': 'menerima pengekodan', 'X-Ratelimit-Limit': '40', 'X-Ratelimit-Remaining': '39', 'Via': '1.1 Vegur, http/1.1 api-umbrella (Apachetrafficserver [cmssf]) ',' umur ':' 0 ',' x-cache ':' miss ',' control-control-allow-origin ':'*',' ketat-pengangkutan-keselamatan ':' max-age = 31536000; preload ',' pengekodan kandungan ':' gzip '
Salinan Memuat turun fail
Memuat turun fail juga sangat mudah. Pertama sekali kita mesti menggunakan aliran
parameter Dapatkan
fungsi. Secara lalai parameter ini ditetapkan ke Salah
, dan ini bermaksud bahawa badan respons akan dimuat turun sekaligus. Oleh kerana kita mungkin mahu memuat turun fail yang besar, kami mahu menetapkannya Benar
: Dengan cara ini hanya tajuk respons akan dimuat turun dengan segera dan sambungan akan tetap terbuka sehingga kita dapat memprosesnya lagi seperti yang kita mahukan:
>>> terbaru_kernel_tarball = "https: // cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.7.tar.XZ ">>> dengan permintaan.GET (LINE_KERNEL_TARBALL, stream = true) sebagai tindak balas: ... Dengan Terbuka ("Kernel terkini.tar.XZ "," WB ") sebagai TARBALL: ... untuk sebahagian tindak balas.iter_content (16384): ... Tarball.Tulis (bahagian)
Salinan Kod ini serupa dengan rakan sejawatannya yang standard: perkara yang berubah adalah penggunaan iter_content
kaedah objek tindak balas. Dalam contoh sebelumnya kami beroperasi di dalam gelung sementara, yang kami terganggu hanya apabila kandungan respons dimakan. Menggunakan kaedah ini, kita boleh menulis ke fail destinasi dengan cara yang lebih elegan, kerana kita dapat melangkah ke kandungan respons. The iter_content
kaedah menerima hujah pilihan chunk_size
, An integer
menunjukkan saiz bahagian dalam bait (data untuk dibaca dalam ingatan pada setiap lelaran).
Menghantar data yang dikodkan borang atau JSON dalam permintaan
Menghantar data yang dikodkan borang (contohnya dalam permintaan pos) dengan perpustakaan "permintaan", memerlukan kurang kod daripada operasi yang sama yang dilakukan hanya menggunakan perpustakaan standard:
>>> request_data = ... "Variable1": "Value1", ... "Variable2": "Value2" ... >>> respons = permintaan.Post ("https: // httpbin.org/pos ", data = request_data)
Salinan Untuk lulus data yang sama, tetapi sebagai JSON:
respons = permintaan.Post ("https: // httpbin.org/pos ", json = request_data)
Dengan menggunakan json
Parameter fungsi, kita tidak perlu risau mengenai pengekodan rentetan menggunakan json.membuang
: ia akan dilakukan untuk digunakan di bawah tudung.
Memuat naik fail
Memuat naik fail menggunakan perpustakaan standard boleh menjadi tugas yang sangat membosankan, tetapi sangat mudah menggunakan permintaan
Perpustakaan. Katakan kita mahu memuat naik gambar:
>>> respons = permintaan.Post ( ... "https: // httpbin.org/pos ", files = 'file': buka ('nasa_black_hole.png ',' rb '))
Salinan Kod pendek yang mengagumkan! Kami melakukan a jawatan
permintaan, kali ini menggunakan fail
argumen. Hujah ini mestilah kamus di mana kunci adalah "nama" medan dan nilai adalah objek fail, dalam kes ini dikembalikan oleh buka
fungsi.
Bagaimana dengan kata kerja HTTP yang lain? Setiap satu daripada mereka digunakan dengan fungsi yang dinamakan dengan sewajarnya: letak
, Padam
, kepala
atau pilihan
. Semuanya boleh digunakan dengan pada dasarnya antara muka yang sama seperti yang kita lihat sebelumnya.
Bekerja dengan sesi
The permintaan
Perpustakaan membolehkan kami menggunakan sesi
: Apabila permintaan dihantar dari konteks sesi, kuki dipelihara antara satu permintaan dan yang lain. Ini adalah cara yang disyorkan untuk melaksanakan pelbagai permintaan kepada tuan rumah yang sama, walaupun sama TCP
Sambungan akan digunakan semula. Mari lihat cara membuat sesi dan hantar permintaan dengannya:
>>> sesi = permintaan.Sesi () >>> respons = sesi.Dapatkan ("https: // httpbin.org/cookies/set?LastName = Skywalker ")
Salinan Kami mencipta contoh permintaan.Sesi
kelas, dan, bukannya menjalankan permintaan dengan sendirinya, seperti yang kita lakukan dalam contoh sebelumnya, kami menggunakan kaedah yang dinamakan selepas kata kerja HTTP, (Dapatkan
dalam kes ini) yang digunakan dengan cara yang sama. URL permintaan, kali ini, adalah http: // httpbin.org/cookies/set, titik akhir yang membolehkan kami menetapkan parameter cookie yang kami hantar dalam rentetan pertanyaan. Panggilan yang kami buat menetapkan kuki yang kini disimpan dalam sesi, dan akan digunakan dalam semua permintaan yang dihantar dari sesi
konteks. Untuk menyenaraikan semua kuki yang berkaitan dengan sesi kami dapat mengakses kuki
harta benda, yang merupakan contoh permintaan.kuki.PermintaanScookiejar '
Kelas:
>>> sesi.kuki >>> # mengakses kekunci kuki ...sesi.kuki.Kekunci () ['LastName'] >>> >>> # Akses nilai kuki ...sesi.kuki.Nilai () ['Skywalker'] >>> >>> # Kaedah ITerkeys mengembalikan iterator nama kuki ...sesi.kuki.iterkeys () >>> # kaedah itervalues melakukan perkara yang sama tetapi untuk nilai ...sesi.kuki.itervalues ()
Salinan Untuk membersihkan kuki yang disimpan dalam sesi kita boleh menggunakan jelas
Kaedah:
>>> sesi.kuki.jelas () >>> sesi.kuki
Salinan Buat objek permintaan
Sehingga kini kami hanya menggunakan fungsi seperti Dapatkan
, jawatan
atau letak
yang pada dasarnya membuat dan menghantar permintaan "dengan cepat". Terdapat kes di mana kita mahu membina a Permintaan
objek tetapi kami tidak mahu menghantarnya segera. Inilah cara kita dapat melakukannya:
>>> permintaan = permintaan.Permintaan ("Dapatkan", "https: // httpbin.org/get ")
Hujah pertama mengenai Permintaan
Pembina adalah kata kerja yang ingin kami gunakan dan yang kedua, url destinasi. Parameter yang sama yang kami gunakan apabila kami menghantar permintaan secara langsung boleh digunakan: tajuk
, param
, data
, json
dan fail
. Sebaik sahaja kita mencipta a Permintaan
Kita mesti "mempersiapkan" sebelum kita dapat menghantarnya:
>>> sesi = permintaan.Sesi () >>> permintaan = permintaan.Permintaan ("Dapatkan", "https: // httpbin.org/get ") >>> prepared_request = sesi.prepare_request (permintaan) >>> respons = sesi.Hantar (Prepared_Request)
Salinan Kami juga boleh menyediakan a Permintaan
menggunakan Sediakan
kaedah Permintaan
objek itu sendiri, bukannya memanggil sesi.menyediakan_request
, Tetapi dalam kes ini, permintaan itu akan kehilangan kelebihan menjadi sebahagian daripada sesi.
Meningkatkan pengecualian apabila kod status tindak balas tidak 200
Kod status yang dikembalikan oleh pelayan apabila permintaan berjaya adalah 200
. Apabila beberapa kesilapan berlaku, contohnya apabila sumber tidak dijumpai atau apabila kita tidak diberi kuasa untuk mengaksesnya, kod lain dikembalikan (dalam kes ini 404 dan 403 masing -masing). Apabila ini berlaku dan kami mahu kod kami meningkatkan pengecualian, kami mesti memanggilnya raise_for_status
kaedah permintaan.model.Respons
objek. Mari kita lihat bagaimana kod tersebut bertindak secara berbeza apabila kita menggunakannya. Kami menghantar permintaan pos ke titik akhir yang hanya menerima kata kerja GET:
>>> respons = permintaan.Post ('https: // httpbin.org/get ') >>> respons.status_code 405 >>> respons.Kaedah 'alasan tidak dibenarkan'
Salinan Seperti yang dijangkakan, kerana kami menggunakan kata kerja HTTP yang salah, kod status tindak balas adalah 405
, Dan "alasan" yang sepadan adalah Kaedah tidak dibenarkan
, Namun tidak ada pengecualian yang dibangkitkan. Untuk membiarkan permintaan buruk menaikkan pengecualian
Kita mesti memanggil raise_for_status
kaedah selepas menghantar permintaan:
>>> respons = permintaan.Post ('https: // httpbin.org/get ') >>> respons.raise_for_status () traceback (panggilan terakhir terakhir): fail "", baris 1, dalam fail "/usr/lib/python3.7/laman web/permintaan/model.py ", baris 940, dalam raise_for_status menaikkan httperror (http_error_msg, response = diri) permintaan.pengecualian.Httperror: 405 Kesalahan pelanggan: Kaedah tidak dibenarkan untuk URL: https: // httpbin.org/get
Salinan Sejak kami memanggil raise_for_status
, Kali ini permintaan itu dibangkitkan permintaan.pengecualian.Httperror
pengecualian.
Kesimpulan
Dalam artikel ini, salah satu siri kedua mengenai melakukan permintaan HTTP dengan Python, kami memberi tumpuan
Mengenai penggunaan luaran permintaan
perpustakaan, yang membolehkan kita melakukan permintaan sederhana dan kompleks
Dalam beberapa baris kod. Ingin mengetahui lebih lanjut mengenainya? Dokumentasi rasmi hanya satu klik jauhnya!
Tutorial Linux Berkaitan:
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Cara Menyiapkan Pelayan OpenVPN di Ubuntu 20.04
- Menguasai Gelung Skrip Bash
- Cara Bekerja Dengan API Rest WooCommerce dengan Python
- Perkara yang hendak dipasang di Ubuntu 20.04
- Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
- Gelung bersarang dalam skrip bash
- Cara Membina Aplikasi TKInter Menggunakan Objek Berorientasikan ..
- Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
- Cara melancarkan proses luaran dengan Python dan ..
- « Cara Melakukan Permintaan HTTP Dengan Python - Bahagian 1 Perpustakaan Standard
- Cara Melakukan Permintaan HTTP dengan Python »