Permintaan API sederhana berarti bahwa semua bentuk permintaan HTTP sama jelasnya. Misalnya, ini adalah cara Anda membuat permintaan HTTP POST
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'})
Bagus, bukan? . PUT, DELETE, HEAD dan OPSI?
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _
Itu semua baik dan bagus, tetapi itu juga hanya permulaan dari apa yang dapat dilakukan oleh Permintaan
Melewati Parameter Dalam URL
Anda sering kali ingin mengirim semacam data dalam string kueri URL. Jika Anda membuat URL secara manual, data ini akan diberikan sebagai pasangan kunci/nilai di URL setelah tanda tanya, mis. g. >>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _8. Permintaan memungkinkan Anda memberikan argumen ini sebagai kamus string, menggunakan argumen kata kunci >>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') 9. Sebagai contoh, jika Anda ingin meneruskan >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) _0 dan >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 1 ke >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 2, Anda akan menggunakan kode berikut
>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) _
Anda dapat melihat bahwa URL telah dikodekan dengan benar dengan mencetak URL
>>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 _
Perhatikan bahwa kunci kamus apa pun yang nilainya >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 3 tidak akan ditambahkan ke string kueri URL
Anda juga dapat meneruskan daftar item sebagai nilai
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3
Konten Respons
Kami dapat membaca konten respons server. Pertimbangkan garis waktu GitHub lagi
>>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/...
Permintaan akan secara otomatis mendekodekan konten dari server. Sebagian besar rangkaian karakter unicode didekodekan dengan mulus
Saat Anda membuat permintaan, Permintaan membuat tebakan cerdas tentang penyandian respons berdasarkan header HTTP. Pengkodean teks yang ditebak oleh Permintaan digunakan saat Anda mengakses >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 4. Anda dapat mengetahui apa yang digunakan Permintaan penyandian, dan mengubahnya, menggunakan properti >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 5
>>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1'
Jika Anda mengubah enkode, Permintaan akan menggunakan nilai baru >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 5 setiap kali Anda memanggil >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 4. Anda mungkin ingin melakukan ini dalam situasi apa pun di mana Anda dapat menerapkan logika khusus untuk mengetahui apa yang akan menjadi penyandian konten. Misalnya, HTML dan XML memiliki kemampuan untuk menentukan penyandiannya di dalam tubuhnya. Dalam situasi seperti ini, Anda harus menggunakan >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) _8 untuk menemukan penyandian, lalu atur >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 5. Ini akan memungkinkan Anda menggunakan >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 4 dengan penyandian yang benar
Permintaan juga akan menggunakan penyandian khusus jika Anda membutuhkannya. Jika Anda telah membuat penyandian sendiri dan mendaftarkannya dengan modul >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 1, Anda cukup menggunakan nama kodek sebagai nilai >>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get('//httpbin.org/get', params=payload) 5 dan Permintaan akan menangani pengodean untuk Anda
Konten Respons Biner
Anda juga dapat mengakses isi respons sebagai byte, untuk permintaan non-teks
>>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/...
>>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 3 dan >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 4 transfer-encodings secara otomatis diterjemahkan untuk Anda
Transfer-encoding >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 5 secara otomatis diterjemahkan untuk Anda jika perpustakaan Brotli seperti brotli atau brotlicffi diinstal
Misalnya, untuk membuat gambar dari data biner yang dikembalikan oleh permintaan, Anda dapat menggunakan kode berikut
>>> r = requests.get('//api.github.com/events') 0
Konten Respons JSON
Ada juga dekoder JSON bawaan, jika Anda berurusan dengan data JSON
>>> r = requests.get('//api.github.com/events') 1
Jika decoding JSON gagal, >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 6 memunculkan pengecualian. Misalnya, jika respons mendapatkan 204 (Tidak Ada Konten), atau jika respons berisi JSON yang tidak valid, mencoba >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 6 memunculkan >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 8. Pengecualian pembungkus ini menyediakan interoperabilitas untuk beberapa pengecualian yang mungkin dilemparkan oleh versi python yang berbeda dan pustaka serialisasi json
Perlu dicatat bahwa keberhasilan panggilan ke >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 6 tidak menunjukkan keberhasilan respons. Beberapa server mungkin mengembalikan objek JSON dalam respons yang gagal (mis. g. detail kesalahan dengan HTTP 500). JSON tersebut akan diterjemahkan dan dikembalikan. Untuk memeriksa apakah permintaan berhasil, gunakan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 0 atau centang >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 1 adalah yang Anda harapkan
Konten Respons Mentah
Jika Anda ingin mendapatkan respons soket mentah dari server, Anda dapat mengakses >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 2. Jika Anda ingin melakukan ini, pastikan Anda menetapkan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 3 dalam permintaan awal Anda. Setelah Anda melakukannya, Anda dapat melakukan ini
>>> r = requests.get('//api.github.com/events') 2
Namun secara umum, Anda harus menggunakan pola seperti ini untuk menyimpan apa yang sedang dialirkan ke file
>>> r = requests.get('//api.github.com/events') 3
Menggunakan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 _4 akan menangani banyak hal yang seharusnya Anda tangani saat menggunakan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 5 secara langsung. Saat streaming unduhan, cara di atas adalah cara yang disukai dan disarankan untuk mengambil konten. Perhatikan bahwa >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 _6 dapat disesuaikan secara bebas ke angka yang mungkin lebih sesuai dengan kasus penggunaan Anda
Catatan
Catatan penting tentang penggunaan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 _4 versus >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 5. >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 _4 akan secara otomatis mendekode >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 3 dan >>> print(r.url) //httpbin.org/get?key2=value2&key1=value1 4 transfer-encodings. >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 _5 adalah aliran byte mentah – tidak mengubah konten respons. Jika Anda benar-benar membutuhkan akses ke byte saat dikembalikan, gunakan >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('//httpbin.org/get', params=payload) >>> print(r.url) //httpbin.org/get?key1=value1&key2=value2&key2=value3 5
Header Kustom
Jika Anda ingin menambahkan tajuk HTTP ke permintaan, cukup berikan >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 4 ke parameter >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 5
Misalnya, kami tidak menentukan agen pengguna kami di contoh sebelumnya
>>> r = requests.get('//api.github.com/events') 4
Catatan. Tajuk khusus kurang diutamakan daripada sumber informasi yang lebih spesifik. Contohnya
Header otorisasi yang diatur dengan headers= akan diganti jika kredensial ditentukan di >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 6, yang pada gilirannya akan diganti oleh parameter >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 7. Permintaan akan mencari file netrc di ~/. netrc, ~/_netrc, atau di jalur yang ditentukan oleh variabel lingkungan NETRC
Header otorisasi akan dihapus jika Anda dialihkan ke luar host
Header Proxy-Authorization akan diganti dengan kredensial proxy yang disediakan di URL
Header Content-Length akan diganti saat kita dapat menentukan panjang konten
Selain itu, Permintaan tidak mengubah perilakunya sama sekali berdasarkan header khusus yang ditentukan. Header hanya diteruskan ke permintaan akhir
Catatan. Semua nilai tajuk harus berupa >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... _8, bytestring, atau unicode. Meskipun diizinkan, disarankan untuk tidak meneruskan nilai header unicode
Permintaan POST yang lebih rumit
Biasanya, Anda ingin mengirim beberapa data yang disandikan formulir — seperti formulir HTML. Untuk melakukan ini, cukup berikan kamus ke argumen >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 9. Kamus data Anda akan secara otomatis dikodekan dalam bentuk saat permintaan dibuat
>>> r = requests.get('//api.github.com/events') 5
Argumen >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... _9 juga dapat memiliki beberapa nilai untuk setiap kunci. Ini dapat dilakukan dengan membuat >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 9 baik daftar tupel atau kamus dengan daftar sebagai nilai. Ini sangat berguna ketika formulir memiliki banyak elemen yang menggunakan kunci yang sama
>>> r = requests.get('//api.github.com/events') 6
Ada kalanya Anda mungkin ingin mengirim data yang tidak disandikan formulir. Jika Anda mengirimkan >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... _8 alih-alih >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 4, data tersebut akan diposting secara langsung
Misalnya, GitHub API v3 menerima data POST/PATCH dengan Enkode JSON
>>> r = requests.get('//api.github.com/events') 7
Harap dicatat bahwa kode di atas TIDAK akan menambahkan >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' 4 header (jadi khususnya TIDAK akan mengaturnya ke >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' 5)
Jika Anda memerlukan set tajuk itu dan Anda tidak ingin menyandikan sendiri >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 4, Anda juga dapat meneruskannya secara langsung menggunakan parameter >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' 7 (ditambahkan dalam versi 2. 4. 2) dan itu akan dikodekan secara otomatis
>>> r = requests.get('//api.github.com/events') 8
>>> r = requests.get('//api.github.com/events') _9
Perhatikan, parameter >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' _7 diabaikan jika >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 9 atau >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 0 diteruskan
POST File yang Disandikan Multipart
Permintaan memudahkan untuk mengunggah file yang disandikan Multipart
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) 0
Anda dapat mengatur nama file, content_type, dan header secara eksplisit
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _1
Jika mau, Anda dapat mengirim string untuk diterima sebagai file
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _2
Jika Anda memposting file yang sangat besar sebagai permintaan >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 1, Anda mungkin ingin mengalirkan permintaan tersebut. Secara default, >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... _2 tidak mendukung ini, tetapi ada paket terpisah yang mendukung - >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 3. Anda harus membaca dokumentasi toolbelt untuk detail lebih lanjut tentang cara menggunakannya
Untuk mengirim banyak file dalam satu permintaan, lihat bagian ini
Peringatan
Sangat disarankan agar Anda membuka file di. Hal ini karena Permintaan dapat mencoba untuk memberikan >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 4 header untuk Anda, dan jika demikian, nilai ini akan ditetapkan ke jumlah byte dalam file. Kesalahan dapat terjadi jika Anda membuka file dalam mode teks
Kode Status Respons
Kami dapat memeriksa kode status respons
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _3
Permintaan juga dilengkapi dengan objek pencarian kode status bawaan untuk referensi mudah
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _4
Jika kami membuat permintaan buruk (kesalahan klien 4XX atau respons kesalahan server 5XX), kami dapat mengajukannya
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) 5
Namun, karena >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... _6 untuk >>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') 7 adalah >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 8, saat kita memanggil >>> r.content b'[{"repository":{"open_issues":0,"url":"//github.com/... 9 kita mendapatkan
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _6
Semua baik-baik saja
Tajuk Respons
Kita dapat melihat header respons server menggunakan kamus Python
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _7
Kamus itu istimewa. itu dibuat hanya untuk header HTTP. Menurut , nama HTTP Header tidak peka huruf besar-kecil
Jadi, kita dapat mengakses header menggunakan kapitalisasi apa pun yang kita inginkan
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _8
Ini juga istimewa karena server dapat mengirim tajuk yang sama beberapa kali dengan nilai yang berbeda, tetapi permintaan menggabungkannya sehingga dapat direpresentasikan dalam kamus dalam satu pemetaan, sesuai
Penerima MUNGKIN menggabungkan beberapa bidang tajuk dengan nama bidang yang sama menjadi satu “nama bidang. bidang-nilai”, tanpa mengubah semantik pesan, dengan menambahkan setiap nilai bidang berikutnya ke nilai bidang gabungan secara berurutan, dipisahkan dengan koma
Kue
Jika respons berisi beberapa Cookie, Anda dapat mengaksesnya dengan cepat
>>> r = requests.post('//httpbin.org/post', data={'key': 'value'}) _9
Untuk mengirim cookie Anda sendiri ke server, Anda dapat menggunakan parameter >>> r = requests.get('//api.github.com/events') 00
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _0
Cookie dikembalikan dalam , yang bertindak seperti >>> import requests >>> r = requests.get('//api.github.com/events') >>> r.text '[{"repository":{"open_issues":0,"url":"//github.com/... 4 tetapi juga menawarkan antarmuka yang lebih lengkap, cocok untuk digunakan pada beberapa domain atau jalur. Guci kue juga bisa diteruskan ke permintaan
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _1
Pengalihan dan Sejarah
Secara default, Permintaan akan melakukan pengalihan lokasi untuk semua kata kerja kecuali HEAD
Kita dapat menggunakan properti >>> r = requests.get('//api.github.com/events') _03 dari objek Response untuk melacak pengalihan
Daftar berisi objek yang dibuat untuk menyelesaikan permintaan. Daftar diurutkan dari respons terlama hingga yang terbaru
Misalnya, GitHub mengalihkan semua permintaan HTTP ke HTTPS
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _2
Jika Anda menggunakan GET, OPTIONS, POST, PUT, PATCH atau DELETE, Anda dapat menonaktifkan penanganan pengalihan dengan parameter >>> r = requests.get('//api.github.com/events') 06
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _3
Jika Anda menggunakan HEAD, Anda juga dapat mengaktifkan pengalihan
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _4
Timeout
Anda dapat memberi tahu Permintaan untuk berhenti menunggu respons setelah beberapa detik dengan parameter >>> r = requests.get('//api.github.com/events') 07. Hampir semua kode produksi harus menggunakan parameter ini di hampir semua permintaan. Kegagalan untuk melakukannya dapat menyebabkan program Anda macet tanpa batas
>>> r = requests.put('//httpbin.org/put', data={'key': 'value'}) >>> r = requests.delete('//httpbin.org/delete') >>> r = requests.head('//httpbin.org/get') >>> r = requests.options('//httpbin.org/get') _5
Catatan
>>> r = requests.get('//api.github.com/events') 07 bukan batas waktu untuk seluruh unduhan respons; . Jika tidak ada batas waktu yang ditentukan secara eksplisit, permintaan tidak akan habis
Kesalahan dan Pengecualian
Jika terjadi masalah jaringan (mis. g. Kegagalan DNS, koneksi ditolak, dll), Permintaan akan memunculkan pengecualian
akan memunculkan jika permintaan HTTP mengembalikan kode status yang gagal
Jika waktu permintaan habis, pengecualian akan dimunculkan
Jika permintaan melebihi jumlah pengalihan maksimum yang dikonfigurasi, pengecualian akan dimunculkan
Semua pengecualian yang dimunculkan oleh Permintaan secara eksplisit diwarisi dari
Siap untuk lebih?
Jika Anda berada di pasar kerja, pertimbangkan untuk mengikuti kuis pemrograman ini. Sumbangan besar akan diberikan untuk proyek ini, jika Anda menemukan pekerjaan melalui platform ini