Cara Melakukan Permintaan HTTP Dengan Python - Bagian 2 - Perpustakaan Permintaan

Cara Melakukan Permintaan HTTP Dengan Python - Bagian 2 - Perpustakaan Permintaan

Di artikel sebelumnya kami melihat cara melakukan permintaan HTTP dasar menggunakan pustaka standar Python3. Ketika permintaan menjadi lebih kompleks, atau kami hanya ingin menggunakan lebih sedikit kode, dan kami tidak keberatan menambahkan ketergantungan pada proyek kami, itu mungkin (dan kadang -kadang bahkan disarankan) untuk menggunakan eksternal permintaan modul. Perpustakaan, yang mengadopsi moto "http for human", akan menjadi fokus artikel ini.

Dalam tutorial ini Anda akan belajar:

  • Cara melakukan permintaan HTTP dengan Python3 dan Perpustakaan 'Permintaan'
  • Cara mengelola respons server
  • Bagaimana bekerja dengan sesi


Permintaan HTTP dengan Python - PT. II: Perpustakaan Permintaan

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem OS-independen
Perangkat lunak Python3 dan perpustakaan "permintaan"
Lainnya Pengetahuan tentang konsep dasar pemrograman berorientasi objek dan python
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Melakukan permintaan dengan perpustakaan "permintaan"

Di bagian pertama dari seri ini, kami melakukan permintaan HTTP dasar hanya menggunakan pustaka standar. Ketika permintaan menjadi lebih kompleks, misalnya ketika kita perlu melestarikan cookie antara satu permintaan dan yang lain, kita dapat menggunakan permintaan Perpustakaan Eksternal, yang menyederhanakan pekerjaan kami, melakukan banyak operasi di bawah kap kami. Karena perpustakaan tidak termasuk dalam instalasi python3 default, kami harus menginstalnya di sistem kami sebelum kami dapat menggunakannya. Metode distribusi-independen untuk menyelesaikan tugas adalah menggunakan Pip, Manajer Paket Python:

$ Pip3 Instal Requests -Pengguna


Sekarang setelah kami menginstal perpustakaan, mari kita lihat beberapa contoh cara menggunakannya.

Melakukan permintaan mendapatkan

Ingat permintaan yang kami buat menggunakan API NASA, untuk mengambil "gambar hari" untuk tanggal tertentu? Membangun dan mengirimkan permintaan yang sama dengan permintaan Perpustakaan hanya membutuhkan satu baris kode:

>>> Impor Permintaan >>> Tanggapan = Permintaan.get ("https: // api.NASA.gov/planetary/apod ", params = " api_key ":" demo_key "," date ":" 2019-04-11 ") 
Menyalin

Kami melewati URL dan parameter kueri (masih sebagai kamus), masing -masing sebagai argumen pertama dan kedua dari mendapatkan fungsi. Apa fungsi fungsi ini? Itu mengembalikan instance dari permintaan.model.Tanggapan kelas. Berinteraksi dengan contoh kelas ini sangat mudah. Apakah kami ingin mengambil konten yang dikodekan JSON dari tanggapan tersebut? Mudah! kita hanya perlu memanggil json Metode objek:

>>> Respons.json () 'date': '2019-04-11', 'penjelasan': 'Seperti apa lubang hitam itu terlihat seperti lubang hitam? Untuk mengetahuinya, teleskop radio 'dari seluruh bumi pengamatan terkoordinasi' 'lubang hitam dengan cakrawala peristiwa terbesar yang diketahui di' ... 'Lingkungan langsung dari lubang hitam di tengah galaksi' 'Bima Sakti' kami.',' hdurl ':' https: // apod.NASA.GOV/APOD/IMAGE/1904/M87BH_EHT_2629.jpg ',' media_type ':' gambar ',' service_version ':' v1 ',' judul ':' gambar skala horizon pertama dari lubang hitam ',' url ':' https: // apod.NASA.GOV/APOD/IMAGE/1904/M87BH_EHT_960.jpg ' 
Menyalin

Apakah kami ingin mendapatkan respons server sebagai string? Yang harus kita lakukan adalah mengakses teks Properti:

tanggapan.teks

Dengan cara yang sama kita dapat mengakses ke alasan, Kode status Dan header permintaan. Kami hanya perlu mengakses properti masing -masing:

>>> Respons.alasan 'ok' >>> respons.status_code 200 >>> Respons.header 'server': 'openresty', 'date': 'thu, 18 Apr 2019 10:46:26 gmt', 'tipe konten': 'aplikasi/json', 'transfer-encoding': 'chunked', 'Koneksi': 'Keep-Alive', 'Vary': 'Accept-Encoding', 'X-Ratelimit-Limit': '40', 'X-Ratelimit-Remaining': '39', 'via': '1.1 Vegur, http/1.1 API-BUMBRELLA (ApachetrafficServer [CMSSF]) ',' Age ':' 0 ',' X-Cache ':' Miss ',' Access-Control-Allow-Origin ':'*',' ketat-transport-sekuritas ':' MAX-AGE = 31536000; preload ',' encoding konten ':' gzip ' 
Menyalin

Mengunduh file

Mengunduh file juga sangat mudah. Pertama -tama kita harus menggunakan sungai kecil parameter mendapatkan fungsi. Secara default parameter ini diatur ke PALSU, dan ini berarti bahwa tubuh respons akan diunduh sekaligus. Karena kami mungkin ingin mengunduh file besar, kami ingin mengaturnya BENAR: Dengan cara ini hanya header respons yang akan segera diunduh dan koneksi akan tetap terbuka sehingga kami dapat memprosesnya lebih lanjut seperti yang kami inginkan:



>>> terbaru_kernel_tarball = "https: // cdn.inti.org/pub/linux/kernel/v5.X/Linux-5.0.7.ter.xz ">>> dengan permintaan.get (lEBIHT_KERNEL_TARBALL, stream = true) sebagai respons: ... dengan terbuka ("Kernel terbaru.ter.XZ "," WB ") sebagai Tarball: ... untuk tanggapan Chunk.iter_content (16384): ... Tarball.tulis (chunk) 
Menyalin

Kode ini mirip dengan mitra perpustakaan standarnya: hal yang berubah adalah penggunaan iter_content Metode objek respons. Dalam contoh sebelumnya kami beroperasi di dalam beberapa saat loop, yang kami selarut hanya ketika konten respons dikonsumsi. Menggunakan metode ini, kita dapat menulis ke file tujuan dengan cara yang lebih elegan, karena kita dapat mengulangi konten respons. Itu iter_content Metode menerima argumen opsional chunk_size, sebuah bilangan bulat menunjukkan ukuran chunk dalam byte (data untuk dibaca dalam memori di setiap iterasi).

Mengirim data atau JSON yang dikodekan formulir dalam permintaan

Mengirim data yang dikodekan formulir (misalnya dalam permintaan pos) dengan pustaka "permintaan", membutuhkan lebih sedikit kode daripada operasi yang sama yang dilakukan hanya menggunakan pustaka standar:

>>> request_data =  ... "Variabel1": "value1", ... "Variabel2": "value2" ... >>> respons = permintaan.POST ("https: // httpbin.org/post ", data = request_data) 
Menyalin

Untuk meneruskan data yang sama, tetapi sebagai JSON:

respons = permintaan.POST ("https: // httpbin.org/post ", json = request_data)

Dengan menggunakan json parameter fungsi, kita bahkan tidak perlu khawatir mengkode string menggunakan json.kesedihan: Ini akan dilakukan untuk digunakan di bawah kap.

Mengunggah file

Mengunggah file menggunakan pustaka standar bisa menjadi tugas yang sangat membosankan, tetapi sangat mudah menggunakan permintaan perpustakaan. Katakanlah kami ingin mengunggah gambar:

>>> Respons = Permintaan.pos( ... "https: // httpbin.org/post ", file = 'file': buka ('nasa_black_hole.png ',' rb ')) 
Menyalin

Kode pendek yang mengesankan! Kami melakukan a pos permintaan, kali ini menggunakan file argumen. Argumen ini harus menjadi kamus di mana kunci adalah bidang "nama" dan nilainya adalah objek file, dalam hal ini dikembalikan oleh membuka fungsi.

Bagaimana dengan kata kerja http lainnya? Masing -masing dari mereka digunakan dengan fungsi bernama yang sesuai: meletakkan, menghapus, kepala atau pilihan. Semuanya dapat digunakan dengan antarmuka yang pada dasarnya sama seperti yang kita lihat sebelumnya.

Bekerja dengan Sesi

Itu permintaan perpustakaan memungkinkan kami untuk menggunakan sesi: Ketika permintaan dikirim dari konteks sesi, cookie disimpan di antara satu permintaan dan yang lainnya. Ini adalah cara yang disarankan untuk melakukan beberapa permintaan ke host yang sama, karena bahkan hal yang sama TCP Koneksi akan digunakan kembali. Mari kita lihat cara membuat sesi dan mengirim permintaan dengan itu:

>>> sesi = permintaan.Sesi () >>> respons = sesi.get ("https: // httpbin.org/cookie/set?LastName = Skywalker ") 
Menyalin

Kami membuat contoh dari permintaan.Sidang kelas, dan, alih -alih menjalankan permintaan dengan sendirinya, seperti yang kami lakukan pada contoh sebelumnya, kami menggunakan metode yang dinamai kata kerja http, (mendapatkan dalam hal ini) yang digunakan dengan cara yang sama. URL permintaan, kali ini, http: // httpbin.org/cookie/set, titik akhir yang memungkinkan kami mengatur parameter cookie yang kami kirim di string kueri. Panggilan yang kami lakukan mengatur cookie yang sekarang disimpan dalam sesi, dan akan digunakan dalam semua permintaan yang dikirim dari sidang konteks. Untuk mencantumkan semua cookie yang terkait dengan sesi, kami dapat mengakses kue properti, yang merupakan contoh dari permintaan.kue.Requestscookiejar ' kelas:

>>> Sesi.kue  >>> # Akses tombol cookie ...sidang.kue.Keys () ['LastName'] >>> >>> # Akses Nilai Cookie ...sidang.kue.values ​​() ['Skywalker'] >>> >>> # Metode iterkeys mengembalikan iterator nama cookie ...sidang.kue.iterkeys ()  >>> # Metode ITerValues ​​melakukan hal yang sama tetapi untuk nilai ...sidang.kue.itervalues ​​()  
Menyalin

Untuk membersihkan cookie yang tersimpan di sesi ini kita dapat menggunakan jernih metode:

>>> Sesi.kue.clear () >>> sesi.kue  
Menyalin

Buat Objek Permintaan

Sampai sekarang kami hanya menggunakan fungsi seperti mendapatkan, pos atau meletakkan yang pada dasarnya membuat dan mengirim permintaan "dengan cepat". Ada kasus di mana kami ingin membangun a Meminta objek tetapi kami tidak ingin segera mengirimkannya. Inilah cara kita bisa melakukannya:

>>> Permintaan = Permintaan.Permintaan ("get", "https: // httpbin.org/get ")

Argumen pertama dari Meminta Konstruktor adalah kata kerja yang ingin kami gunakan dan yang kedua, URL tujuan. Parameter yang sama yang kami gunakan saat kami mengirim permintaan secara langsung dapat digunakan: header, params, data, json Dan file. Setelah kami membuat a Meminta Kita harus "menyiapkan" sebelum kita dapat mengirimkannya:



>>> sesi = permintaan.Session () >>> permintaan = permintaan.Permintaan ("get", "https: // httpbin.org/get ") >>> disiapkan_request = sesi.persiapan_request (permintaan) >>> respons = sesi.kirim (disiapkan_request) 
Menyalin

Kami juga bisa menyiapkan a Meminta menggunakan mempersiapkan metode Meminta objek itu sendiri, alih -alih menelepon sidang.persiapkan_request, Namun dalam hal ini, permintaan akan kehilangan keuntungan menjadi bagian dari sesi.

Naikkan pengecualian saat kode status respons bukan 200

Kode status yang dikembalikan oleh server saat permintaan berhasil 200. Ketika beberapa kesalahan terjadi, misalnya ketika sumber daya tidak ditemukan atau ketika kami tidak berwenang untuk mengaksesnya, kode lain dikembalikan (dalam hal ini masing -masing 404 dan 403). Ketika ini terjadi dan kami ingin kode kami menaikkan pengecualian, kami harus memanggil raise_for_status metode permintaan.model.Tanggapan obyek. Mari kita lihat bagaimana kode berperilaku berbeda saat kita menggunakannya. Kami mengirim permintaan pos ke titik akhir yang hanya menerima kata kerja get:

>>> Respons = Permintaan.Posting ('https: // httpbin.org/get ') >>> Respons.Status_Code 405 >>> Respons.alasan 'metode tidak diperbolehkan' 
Menyalin

Seperti yang diharapkan, karena kami menggunakan kata kerja http yang salah, kode status responsnya 405, dan "alasan" yang sesuai adalah Metode tidak diizinkan, Namun tidak ada pengecualian yang dinaikkan. Untuk membiarkan permintaan yang buruk menaikkan pengecualian kita harus memanggil raise_for_status Metode setelah mengirim permintaan:

>>> Respons = Permintaan.Posting ('https: // httpbin.org/get ') >>> Respons.raise_for_status () traceback (panggilan terbaru terakhir): file "", baris 1, dalam file "/usr/lib/python3.7/paket situs/permintaan/model.py ", baris 940, di raise_for_status raise httperror (http_error_msg, response = self).pengecualian.Httperror: 405 Kesalahan klien: Metode tidak diperbolehkan untuk url: https: // httpbin.org/get 
Menyalin

Sejak kami menelepon raise_for_status, Kali ini permintaan mengangkat permintaan.pengecualian.Httperror pengecualian.

Kesimpulan

Dalam artikel ini, yang kedua dari seri tentang melakukan permintaan HTTP dengan Python, kami fokus
tentang penggunaan eksternal permintaan perpustakaan, yang memungkinkan kami melakukan permintaan sederhana dan kompleks
Dalam beberapa baris kode. Ingin tahu lebih banyak tentang itu? Dokumentasi resmi hanya satu klik!

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Cara Mengatur Server OpenVPN di Ubuntu 20.04
  • Menguasai loop skrip bash
  • Bagaimana bekerja dengan WooCommerce Rest API dengan Python
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Loop bersarang dalam skrip bash
  • Cara Membangun Aplikasi Tkinter Menggunakan Objek Berorientasi…
  • Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
  • Cara meluncurkan proses eksternal dengan Python dan…