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

- 2903
- 19
- Dr. Travis Bahringer
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
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…
- « Cara Melakukan Permintaan HTTP Dengan Python - Bagian 1 Perpustakaan Standar
- Cara melakukan permintaan HTTP dengan Python »