Cara Melakukan Permintaan HTTP dengan Python - Bahagian 2 - Perpustakaan Permintaan

Cara Melakukan Permintaan HTTP dengan Python - Bahagian 2 - Perpustakaan Permintaan

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

Keperluan Perisian dan Konvensyen Talian Perintah Linux
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 ..