Kursus
Application Programming Interfaces (API) adalah perantara perangkat lunak. Tugasnya memungkinkan aplikasi saling berkomunikasi. Perantara yang halus ini muncul dalam kehidupan sehari-hari, sadar atau tidak. Misalnya, jika Anda mengirim pesan instan hari ini, Anda telah menggunakan API.
Secara lebih spesifik, API memungkinkan orang mengirim dan mengambil data menggunakan kode. Namun, penggunaan API untuk mengambil data lebih umum. Sebagai contoh, Anda dapat membaca artikel blog ini karena browser web Anda mengambil data yang membentuk halaman ini dari server DataCamp.
Namun server web tidak mengirim data secara acak. Itu seperti pergi ke restoran dan pelayan secara acak membawakan Anda makanan. Permintaan harus dibuat ke server untuk mengambil data sebelum server merespons dengan data. Ini berlaku untuk pelayan di restoran, dan jika Anda ingin mengambil data dari sebuah API, Anda membuat permintaan API ke server, dan server akan merespons dengan data yang sesuai.
Dalam artikel ini, kita akan menelusuri beberapa komponen inti pustaka requests dan memberikan contoh kode untuk membantu Anda memulai. Pustaka requests layak dipelajari karena ini adalah standar industri de facto untuk mengirim permintaan HTTP di Python. Seperti yang akan Anda lihat, ia menyembunyikan semua tantangan dalam membuat permintaan di balik API yang sederhana, memungkinkan Anda fokus berkomunikasi dengan layanan dan mengonsumsi data di aplikasi Anda.
Jalankan dan edit kode dari tutorial ini secara online.
Jalankan kodeMembuat Permintaan GET dan POST Menggunakan Modul requests Python
Sedang buru-buru? Berikut sintaks Python untuk membuat permintaan GET dan POST sederhana:
1. Permintaan GET
import requests
# The API endpoint
url = "https://jsonplaceholder.typicode.com/posts/1"
# A GET request to the API
response = requests.get(url)
# Print the response
print(response.json())
2. Permintaan POST
import requests
# The API endpoint
url = "https://jsonplaceholder.typicode.com/posts"
# Data to be sent
data = {
"userID": 1,
"title": "Making a POST request",
"body": "This is the data we created."
}
# A POST request to the API
response = requests.post(url, json=data)
# Print the response
print(response.json())
Memahami REST API dan Fondasi HTTP-nya
Kita telah menyimpulkan bahwa API adalah perantara perangkat lunak. Cara lain memikirkannya adalah sebagai jenis antarmuka perangkat lunak yang memberi aplikasi lain akses ke data dan metode tertentu.
Salah satu arsitektur paling populer untuk membangun API adalah pola REpresentational State Transfer (REST). Desain arsitektur REST memungkinkan klien dan server diimplementasikan secara independen tanpa saling mengetahui. Artinya, kode di kedua sisi dapat diubah tanpa khawatir bagaimana perubahan tersebut akan memengaruhi sisi lainnya.
Oleh karena itu, REST API mengikuti serangkaian pedoman yang dirancang untuk menyederhanakan komunikasi antarperangkat lunak, sehingga proses mengakses data menjadi lebih mudah dan logis. Jangan khawatir jika Anda tidak mengetahui pedoman ini; Anda tidak perlu mengetahuinya untuk mulai – yang perlu Anda ketahui adalah bagaimana data diekspos dari layanan REST.
Data dari layanan web REST diekspos ke internet melalui URL publik, yang dapat diakses dengan mengirim permintaan HTTP.
Gambaran Umum Metode Permintaan HTTP
Mari kembali ke analogi restoran; untuk memesan makanan di restoran, pelayan akan mendekati Anda, dan Anda menyebutkan apa yang Anda inginkan. Pelayan lalu menyampaikan permintaan Anda ke koki, yang menyiapkan makanan dan menyerahkannya kembali ke pelayan untuk dikembalikan kepada Anda. Dengan kata lain, koki tidak akan memasak makanan Anda sampai permintaan Anda dikirim.
REST API juga sama: mereka menunggu metode permintaan HTTP sebelum bertindak. HTTP mendefinisikan serangkaian metode permintaan yang memberi tahu API operasi apa yang harus dilakukan untuk suatu sumber daya. Ia menentukan cara berinteraksi dengan sumber daya yang berada di endpoint yang disediakan.
Ada beberapa metode HTTP, tetapi lima yang paling umum digunakan dengan REST API adalah:
| Metode HTTP | Deskripsi |
|---|---|
| GET | Mengambil data |
| POST | Membuat data |
| PUT | Memperbarui data yang sudah ada |
| PATCH | Memperbarui sebagian data yang sudah ada |
| DELETE | Menghapus data |
Sangat mungkin Anda akan lebih sering melakukan permintaan GET daripada metode lainnya dalam analisis data dan data science. Ini karena GET adalah metode yang diperlukan untuk mengakses dataset tertentu. Pelajari lebih lanjut melalui kursus Intermediate Importing Data in Python dari DataCamp.
Saat Anda membuat permintaan ke server web, API mengembalikan respons. Terlampir pada respons adalah kode status HTTP. Tujuan kode status adalah memberikan informasi tambahan tentang respons agar klien mengetahui jenis permintaan yang diterima.
Apa Itu Endpoint API?
Sebuah URL menentukan data yang Anda interaksikan di server web. Mirip seperti URL halaman web terhubung ke satu halaman, URL endpoint ditautkan ke sumber daya tertentu dalam sebuah API. Karena itu, endpoint dapat digambarkan sebagai lokasi digital tempat API menerima permintaan tentang sumber daya tertentu di servernya—anggap saja sebagai ujung lain dari saluran komunikasi.
Untuk menambah konteks, REST API mengekspos serangkaian URL publik yang dapat diminta oleh aplikasi klien untuk mengakses sumber daya layanan web. URL publik yang diekspos oleh REST API dikenal sebagai “endpoint”.
Menggunakan Python untuk Membuat HTTP Request
Modul requests di Python memungkinkan pengembang menulis kode untuk berinteraksi dengan REST API. Modul ini memungkinkan mereka mengirim permintaan HTTP menggunakan Python tanpa harus khawatir dengan kompleksitas yang biasanya menyertai tugas tersebut (misalnya, menambahkan query string ke URL secara manual, form-encoding data PUT dan POST, dll.).
Walaupun dianggap sebagai standar de facto untuk membuat permintaan HTTP di Python, modul requests bukan bagian dari pustaka standar Python – modul ini harus diinstal.
Cara paling sederhana untuk memasang modul requests adalah dengan pip:
python -m pip install requests
Selalu disarankan paket Python yang dibutuhkan untuk berbagai proyek dikelola menggunakan virtual environment; dengan cara ini, paket untuk satu proyek tidak akan mengganggu dan merusak alat sistem di proyek lain karena terisolasi – alih-alih dipasang secara global.
Sekarang kita telah memasang modul requests, mari kita lihat cara kerjanya. Ikuti kode ini di buku kerja DataLab.
Membuat permintaan GET di Python
Kita sudah menyimpulkan bahwa GET adalah salah satu metode permintaan HTTP paling umum yang akan Anda temui saat bekerja dengan REST API. Metode ini memungkinkan Anda (klien) mengambil data dari server web.
Penting untuk dicatat bahwa GET adalah operasi hanya-baca, artinya hanya cocok untuk mengakses sumber daya yang sudah ada dan tidak boleh digunakan untuk memodifikasinya.
Untuk mendemonstrasikan cara kerja modul requests, kita akan menggunakan JSONPlaceholder, yaitu API palsu yang tersedia gratis untuk pengujian dan pembuatan prototipe.
import requests
# The API endpoint
url = "https://jsonplaceholder.typicode.com/posts/1"
# A GET request to the API
response = requests.get(url)
# Print the response
response_json = response.json()
print(response_json)
"""
{'userId': 1, 'id': 1, 'title': 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', 'body': 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto'}
"""
Pada kode di atas, kita melakukan hal-hal berikut:
-
Menetapkan endpoint API tempat data akan diambil.
-
Menggunakan metode
requests.get(url)untuk mengambil data dari endpoint yang ditetapkan. -
Kita menggunakan metode
response.json()untuk menyimpan data respons dalam objek dictionary; perhatikan bahwa ini hanya berfungsi karena hasilnya ditulis dalam format JSON – jika tidak, akan muncul error. -
Langkah terakhir adalah mencetak data respons JSON.
Kita juga dapat memeriksa kode status yang dikembalikan dari API seperti ini:
# Print status code from original response (not JSON)
print(response.status_code)
"""
200
"""
Anda juga dapat meneruskan argumen ke permintaan GET di Python. Untuk melakukannya, kita harus sedikit mengubah kode di atas. Berikut tampilan kode barunya:
# The API endpoint
url = "https://jsonplaceholder.typicode.com/posts/"
# Adding a payload
payload = {"id": [1, 2, 3], "userId":1}
# A get request to the API
response = requests.get(url, params=payload)
# Print the response
response_json = response.json()
for i in response_json:
print(i, "\n")
"""
{'userId': 1, 'id': 1, 'title': 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', 'body': 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto'}
{'userId': 1, 'id': 2, 'title': 'qui est esse', 'body': 'est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla'}
{'userId': 1, 'id': 3, 'title': 'ea molestias quasi exercitationem repellat qui ipsa sit aut', 'body': 'et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut'}
"""
Berikut perbedaan yang kita lakukan:
-
Mengubah endpoint API. Perhatikan tidak ada lagi angka
1di akhir. -
Menentukan payload dalam dictionary.
-
Meneruskan payload ke argumen
paramdari metoderequests.get(). -
Ini mengembalikan objek list, jadi kita melakukan loop melalui list tersebut dan mencetak setiap item pada baris baru.
Membuat permintaan POST di Python
Permintaan GET memungkinkan Anda mengambil data; permintaan POST memungkinkan Anda membuat data baru. Mari kita lihat bagaimana kita dapat membuat data baru di server JSONPlaceholder.
# Define new data to create
new_data = {
"userID": 1,
"id": 1,
"title": "Making a POST request",
"body": "This is the data we created."
}
# The API endpoint to communicate with
url_post = "https://jsonplaceholder.typicode.com/posts"
# A POST request to tthe API
post_response = requests.post(url_post, json=new_data)
# Print the response
post_response_json = post_response.json()
print(post_response_json)
"""
{'userID': 1, 'id': 101, 'title': 'Making a POST request', 'body': 'This is the data we created.'}
"""
Pada kode di atas, kita melakukan hal-hal berikut:
-
Membuat sumber daya baru yang ingin kita tambahkan ke API JSONPlaceholder.
-
Menetapkan endpoint untuk
POSTdata baru. -
Mengirim permintaan
POSTmenggunakan metoderequests.post(). Perhatikan bahwa parameterjsondiatur dalam metodepost(); kita melakukan ini untuk memberi tahu API bahwa kita secara eksplisit mengirim objek JSON ke URL yang ditentukan. -
Menggunakan metode
response.json()untuk menyimpan data respons dalam objek dictionary. -
Langkah terakhir adalah mencetak data respons JSON.
Tapi, tunggu!
Sebelum Anda membaca potongan kode berikutnya, luangkan 20 detik untuk mempertimbangkan kode status apa yang akan dikembalikan API.
Ingat: kali ini, kita membuat sumber daya baru alih-alih sekadar mengambilnya.
Baik, ini dia…
# Print status code from original response (not JSON)
print(post_response.status_code)
"""
201
"""
Topik Lanjutan Python HTTP Requests
Membuat permintaan HTTP dengan Python umumnya mudah; namun, terkadang membutuhkan penyiapan yang lebih lanjut atau menghadapi masalah tidak terhindarkan. Berikut beberapa tantangan yang mungkin Anda temui dan cara mengatasinya.
Autentikasi permintaan HTTP
Sejauh ini, interaksi kita dengan REST API cukup sederhana. API JSONPlaceholder tidak memerlukan autentikasi agar Anda dapat mulai berinteraksi dengannya. Namun, ada beberapa kasus di mana REST API mungkin memerlukan autentikasi sebelum akses diberikan ke endpoint tertentu – terutama saat Anda menangani data sensitif.
Misalnya, jika Anda ingin membuat integrasi, mengambil data, dan mengotomatisasi alur kerja Anda di GitHub, Anda dapat melakukannya dengan GitHub REST API. Namun, ada banyak operasi pada GitHub REST API yang memerlukan autentikasi, seperti mengambil informasi publik dan privat tentang pengguna yang diautentikasi.
Berikut solusi sederhana menggunakan modul requests di Python:
from requests.auth import HTTPBasicAuth
private_url = "https://api.github.com/user"
github_username = "username"
token = "token"
private_url_response = requests.get(
url=private_url,
auth=HTTPBasicAuth(github_username, token)
)
private_url_response.status_code
"""
200
"""
Pada kode di atas kita:
-
Mengimpor objek
HTTPBasicAuthdarirequests.auth. Objek ini melampirkan autentikasi dasar HTTP ke objek permintaan yang diberikan—pada dasarnya sama seperti mengetikkan nama pengguna dan kata sandi Anda ke sebuah situs web. -
Menetapkan endpoint URL privat yang akan diakses.
-
Membuat variabel dengan nama pengguna GitHub – kami menganonimkan nama pengguna demi privasi.
-
Membuat variabel GitHub dengan personal access token untuk autentikasi.
-
Mengambil data dari endpoint kami dan menyimpannya dalam variabel
private_url_response. -
Menampilkan kode status.
Menangani error permintaan HTTP
Ada kalanya permintaan yang dibuat ke sebuah API tidak berjalan seperti yang diharapkan. Beberapa faktor di sisi klien atau server bisa menjadi penyebabnya. Terlepas dari penyebabnya, hasilnya selalu sama: permintaan gagal.
Saat menggunakan REST API, ada baiknya membuat kode Anda tangguh. Namun, sebelum Anda dapat menulis kode yang andal, Anda harus memahami cara mengelola error yang dilaporkan saat sesuatu tidak berjalan sesuai rencana.
Untuk demonstrasi ini, mari kembali ke API JSONPlaceholder. Kita akan mulai dengan menulis beberapa kode lalu menjelaskan apa yang terjadi.
# A deliberate typo is made in the endpoint "postz" instead of "posts"
url = "https://jsonplaceholder.typicode.com/postz"
# Attempt to GET data from provided endpoint
try:
response = requests.get(url)
response.raise_for_status()
# If the request fails (404) then print the error.
except requests.exceptions.HTTPError as error:
print(error)
"""
404 Client Error: Not Found for url: https://jsonplaceholder.typicode.com/postz
"""
Pada kode di atas:
-
Kita menetapkan endpoint JSONPlaceholder tempat data akan diambil, tetapi kita sengaja membuat salah ketik saat menyusun URL – ini akan memunculkan error 404.
-
Kita menggunakan penanganan eksepsi bawaan Python untuk
trydanexcept(menangkap) error apa pun yang terjadi saat mencoba mengunjungi endpoint JSONPlaceholder. Perhatikan metoderaise_for_status()digunakan untuk mengembalikan objekHTTPErrorsaat terjadi error selama proses. -
Dan terakhir, kita mencetak error yang muncul.
Meskipun kita mendemonstrasikan cara menangani kode status error 404 dalam kasus ini, format yang sama dapat digunakan untuk menangani kode status HTTP apa pun.
Menangani terlalu banyak pengalihan (redirect)
Kode status HTTP dengan format 3xx menunjukkan bahwa klien dialihkan dan harus melakukan beberapa tindakan tambahan untuk menyelesaikan permintaan. Namun, ini terkadang dapat menyebabkan loop pengalihan tanpa akhir.
Modul requests Python menyediakan objek TooManyRedirects untuk menangani masalah ini, sebagai berikut:
"""
Note: The code here will not raise an error
but the structure is how you would hand a case where there
are multiple redirects
"""
url = "https://jsonplaceholder.typicode.com/posts"
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.TooManyRedirects as error:
print(error)
Anda juga dapat mengatur jumlah maksimum pengalihan sebagai parameter pada metode permintaan HTTP Anda:
# Solution 2
url = "https://jsonplaceholder.typicode.com/posts"
session = requests.Session()
session.max_redirects = 3
response = session.get(url)
Pilihan lain adalah menonaktifkan pengalihan sepenuhnya:
# Solution 3
url = "https://jsonplaceholder.typicode.com/posts"
session = requests.Session()
session.allow_redirects = False
response = session.get(url)
Menangani kesalahan koneksi permintaan HTTP
Ini adalah jenis error lain yang mungkin Anda hadapi saat mencoba mengirim permintaan ke server. Ada beberapa alasan Anda mungkin tidak menerima respons dari server (misalnya, kegagalan DNS, koneksi ditolak, masalah koneksi internet, dll.), tetapi hasilnya konsisten: error koneksi muncul.
Anda dapat menggunakan objek eksepsi ConnectionError dari modul requests untuk menangkap masalah ini dan menanganinya sesuai kebutuhan.
Berikut tampilan kodenya:
"""
Note: The code here will not raise an error
but the structure is how you would hand a case where there
is a connection error.
"""
url = "https://jsonplaceholder.typicode.com/posts"
try:
response = requests.get(url)
except requests.ConnectionError as error:
print(error)
Menangani timeout permintaan HTTP
Saat server API menerima koneksi Anda tetapi tidak dapat menyelesaikan permintaan Anda dalam waktu yang diizinkan, Anda akan mendapatkan “timeout error”.
Kita akan mendemonstrasikan cara menangani kasus ini dengan mengatur parameter timeout pada metode requests.get() ke angka yang sangat kecil; ini akan memunculkan error, dan kita akan menanganinya menggunakan objek requests.Timeout .
url = "https://jsonplaceholder.typicode.com/posts"
try:
response = requests.get(url, timeout=0.0001)
except requests.Timeout as error:
print(error)
Solusi paling sederhana untuk error timeout adalah mengatur nilai timeout yang lebih lama. Solusi lain dapat mencakup mengoptimalkan permintaan Anda, memasukkan loop retry ke dalam skrip Anda, atau melakukan panggilan API secara asinkron – teknik yang memungkinkan perangkat lunak Anda memulai aktivitas yang berpotensi berjalan lama sambil tetap responsif terhadap peristiwa lain alih-alih menunggu hingga tugas tersebut selesai.
Penutup
Dalam tutorial ini, kita membahas apa itu API dan menelusuri arsitektur API umum bernama REST. Kita juga melihat metode HTTP dan bagaimana kita dapat menggunakan pustaka requests Python untuk berinteraksi dengan layanan web.
Lihat kursus berikut untuk mengembangkan keterampilan data science Anda:
FAQs
Bagaimana Anda menangani header kustom dalam permintaan HTTP Python?
Anda dapat menambahkan header khusus ke permintaan HTTP dengan meneruskan dictionary header ke parameter headers pada permintaan Anda. Contohnya:
import requests
url = "https://jsonplaceholder.typicode.com/posts"
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
print(response.json())
Apa manfaat menggunakan objek session dalam modul requests?
Menggunakan objek Session dalam modul requests memberikan beberapa manfaat, antara lain:
- Koneksi Persisten: Mempertahankan koneksi di beberapa permintaan, sehingga meningkatkan kinerja.
- Pengaturan Tingkat Sesi: Memungkinkan Anda mengatur header, cookie, dan parameter sekali untuk semua permintaan yang dibuat melalui sesi.
- Persistensi Cookie: Menangani cookie secara otomatis, mempertahankannya di berbagai permintaan.
Berikut contohnya:
import requests
session = requests.Session()
session.headers.update({"Authorization": "Bearer YOUR_ACCESS_TOKEN"})
response = session.get("https://jsonplaceholder.typicode.com/posts")
print(response.json())
Bagaimana cara mengirim berkas dengan permintaan POST di Python?
Anda dapat mengirim berkas dengan permintaan POST dengan meneruskan dictionary ke parameter files. Contohnya:
import requests
url = "https://example.com/upload"
file_path = "/path/to/your/file.txt"
with open(file_path, 'rb') as file:
files = {'file': file}
response = requests.post(url, files=files)
print(response.status_code)
Bagaimana Anda mengonfigurasi modul requests untuk menggunakan proxy?
Anda dapat mengonfigurasi proxy dalam modul requests dengan meneruskan dictionary ke parameter proxies. Contohnya:
import requests
url = "https://jsonplaceholder.typicode.com/posts"
proxies = {
"http": "http://10.10.1.10:3128/",
"https": "http://10.10.1.10:1080/",
}
response = requests.get(url, proxies=proxies)
print(response.json())
Bagaimana Anda menangani timeout saat membuat permintaan HTTP dengan modul requests Python?
Anda dapat menangani timeout dengan menentukan parameter timeout pada permintaan Anda. Parameter ini menggunakan nilai dalam detik. Contohnya:
import requests
url = "https://jsonplaceholder.typicode.com/posts"
try:
response = requests.get(url, timeout=5) # Timeout setelah 5 detik
print(response.json())
except requests.Timeout:
print("Permintaan melebihi batas waktu")
