[Python] Tương tác với API bằng Python

Tác giả: 02/02/2024

1 API, hay Application Programming Interface, là 1 giao diện mà giúp chúng ta thu thập và gửi dữ liệu sử dụng code. Chúng ta sử dụng APIs nhiều nhất khi thu thập dữ liệu, và điều đó sẽ được đề cập đến trong bài viết này.

Khi chúng ta muốn thu thập dữ liệu từ API, chúng ta cần tạo 1 requestRequests được sử dụng ở hầu hết mọi website. Ví dụ, khi bạn truy cập bài viết này, trình duyệt của bạn gửi 1 request đến server của Nhân Hòa, thứ mà sẽ phản hồi lại nội dung của trang web bao gồm bài viết.

API request hoạt động với cách thức chính xác như vậy: bạn tạo 1 request đến API server để lấy dữ liệu, và server trả về cho bạn thứ bạn muốn.

Các phương thức HTTP và Mã Trạng Thái

Có nhiều phương thức HTTP cho REST APIs. Những phương thức này giúp API biết được cần phải thực hiện điều gì với dữ liệu. Trong khi có nhiều phương thức HTTP, 5 phương thức HTTP dưới đây được sử dụng hầu hết trong REST APIs:

HTTP METHOD DESCRIPTION
GET Thu thập dữ liệu
POST Thêm dữ liệu mới
PUT Cập nhật dữ liệu đã tồn tại
PATCH Cập nhập dữ liệu của 1 phần chỉ định
DELETE Xóa dữ liệu

Mỗi khi REST API nhận và xử lý HTTP request, nó trả về response với HTTP status code. Mã trạng thái này cung cấp thông tin về response và giúp ứng dụng client biết loại của response.

Mã trạng thái dựa trên bảng phân loại dưới đây:

CODE RANGE CATEGORY
1xx Thông tin response
2xx Thực thi thành công
3xx Chuyển hướng
4xx Lỗi phía client
5xx Lỗi phía máy chủ

API Endpoints

API Endpoint là URLs công khai bởi server mà 1 ứng dụng client sử dụng để truy nhập vào tài nguyên và dữ liệu

Trong bài này chúng ta sử dụng dữ liệu giả, chi tiết trong bảng sau:

HTTP METHOD API ENDPOINT DESCRIPTION
GET /products Lấy danh sách sản phẩm
GET /products?limit=x Lấy sản phẩm x
GET /products/<product_id> Lấy sản phẩm theo id
POST /products Tạo 1 sản phẩm mới
PUT /products/<product_id> Cập nhật 1 sản phẩm
PATCH /products/<product_id> Cập nhật 1 thành phần của sản phẩm
DELETE /products/<product_id> Xóa 1 sản phẩm

Mỗi endpoints trên thực hiện 1 hành động khóa nhau dựa trên HTTP method, với base URL là https://fakestoreapi.com

Trước khi bắt đầu, hãy chắc chắn là đã cài đặt thư viện requests của Python

pip install requests

GET Request

Đây là phương thức HTTP request phổ biến nhất, nó là 1 read-only operation mà chỉ cho phép người sử dụng thu thập dữ liệu từ API.

Hãy thử GET request trên endpoint đầu tiên chúng ta đề cập ở trên mà phản hồi lại 1 danh sách sản phẩm

import requests

BASE_URL = 'https://fakestoreapi.com'

response = requests.get(f"{BASE_URL}/products")
print(response.json())

Script bên trên sử dụng phương thức requests.get() để gửi GET request đến API endpoint /products. Nó phản hồi với 1 danh sách tất cả các sản phẩm. Chúng ta sau đó gọi .json() để xem kết quả dưới dạng JSON.

[
  {
    "id": 1,
    "title": "Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops",
    "price": 109.95,
    "description": "Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve, your everyday",
    "category": "men's clothing",
    "image": "https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg",
    "rating": {
      "rate": 3.9,
      "count": 120
    }
  },
  {
    ...

Nếu ta nhìn kỹ hơn, JSON response trông rất giống Python dictionaries. JSON là 1 định dạng trao đổi dữ liệu rất phổ biến cho REST APIs.

Ta cũng có thể in ra mã trạng thái của response bằng thuộc tính

print(response.status_code)

## OUTPUT
>>> 200

Như đã đề cập ở trên, mã trạng thái 200 có nghĩa là phản hồi thành công

Trong khi /products endpoint trả về rất nhiều dữ liệu, hãy giới hạn nó lại thành 3 products

Để làm điều này, hãy gọi tới endpoint /products?limit=x nơi mà x là số nguyên dương. limit được gọi là tham số truy vấn. Hãy xem cách chúng ta có thể thêm tham số truy vấn này vào request

import requests

BASE_URL = 'https://fakestoreapi.com'

query_params = {
    "limit":3
}

response = requests.get(f"{BASE_URL}/products",params=query_params)
print(response.json())

Phương thức requests.get() lấy tham số gọi là params nơi mà chúng ta có thể chỉ định tham số truy vấn trong định dạng 1 Python dictionary. Theo đó, chúng ta tạo 1 dictionary gọi là query_params và đưa vào đó key limit và value 3. Chúng ta đưa tham số query_params vào requests.get().

Giờ chúng ta có dữ liệu response được giới hạn thành 3 sản phẩm. Hãy thử lấy dữ liệu của sản phẩm có id 18

import requests

BASE_URL = 'https://fakestoreapi.com'

response = requests.get(f"{BASE_URL}/products/18")
print(response.json())

POST Request

Chúng ta sử dụng POST request để thêm 1 dữ liệu mới vào REST API. Dữ liệu được gửi đến server dưới dạng JSON, thứ mà sẽ tương tự như Python dictionary. Theo tài liệu của API mà chúng ta sử dụng trong bài này, 1 sản phẩm có các thuộc tính sau đây: titlepricedescriptionimage và category. Vì vậy, 1 sản phẩm mới sẽ có trông như sau:

new_product = {
    "title": "test product",
    "price": 13.5,
    "description": "lorem ipsum set",
    "image": 'https://i.pravatar.cc',
    "category": "electronic"
}

Giờ hãy gửi POST request này sử dụng requests.post() như sau:

import requests

BASE_URL = 'https://fakestoreapi.com'

new_product = {
    "title": "test product",
    "price": 13.5,
    "description": "lorem ipsum set",
    "image": 'https://i.pravatar.cc',
    "category": "electronic"
}

response = requests.post(f"{BASE_URL}/products", json=new_product)
print(response.json())

Trong phương thức requests.post(), chúng ta truyền vào dữ liệu JSON sử dụng đối số json. Sử dụng đối số json tự động thiết lập Content-Type thành Application/JSON trong request header.

Một khi chúng ta tạo 1 POST request trên /products endpoint, chúng ta có thể lấy đối tượng product với id trong phản hồi, nó có dạng như sau:

{
  "_id": "61b45067e087f30012c45a45",
  "id": 21,
  "title": "test product",
  "price": 13.5,
  "description": "lorem ipsum set",
  "image": "https://i.pravatar.cc",
  "category": "electronic"
}

Nếu chúng ta không sử dụng đối số json, chúng ta phải tạo 1 POST request có dạng như sau:

import requests
import json

BASE_URL = 'https://fakestoreapi.com'

new_product = {
    "title": 'test product',
    "price": 13.5,
    "description": 'lorem ipsum set',
    "image": 'https://i.pravatar.cc',
    "category": 'electronic'
}

headers = {
    "Content-Type": "application/json"
}

response = requests.post(f"{BASE_URL}/products", data=json.dumps(new_product), headers=headers)
print(response.json())

PUT Request

Chúng ta thường cần cập nhật dữ liệu đã tồn tại trong API. Sử dụng PUT request, chúng ta có thể cập nhật dữ liệu hoàn chỉnh. Điều này có nghĩa là khi chúng ta tạo 1 PUT request, nó thay thế dữ liệu cũ với dữ liệu mới.

Trong POST request, chúng ta tạo 1 sản phẩm mới với id là 21. Giờ hãy cập nhật nó:

import requests

BASE_URL = 'https://fakestoreapi.com'

updated_product = {
    "title": 'updated_product',
    "category": 'clothing'
}

response = requests.put(f"{BASE_URL}/products/21", json=updated_product)
print(response.json())

Sau đó, ta sẽ nhập về phản hồi như này:

{
  "id": "21",
  "title": "updated_product",
  "category": "clothing"
}

PATCH Request

Đôi khi, chúng ta không cần phải thay thế hoàn toàn dữ liệu cũ, mà chỉ muốn thay đổi chỉ 1 trường nhất định trong đó. Trong trường hợp này, PATCH request nên được sử dụng.

Hãy cập nhật category của sản phẩm trước đó từ clothing thành electronic:

import requests

BASE_URL = 'https://fakestoreapi.com'

updated_product = {
    "category": 'electronic'
}

response = requests.patch(f"{BASE_URL}/products/21", json=updated_product)
print(response.json())

Trong trường hợp này, chúng ta có thể sử dụng phương thức requests.patch(), thứ mà sẽ trả về 1 phản hồi như thế này:

{
  "id": "21",
  "title": "updated_product",
  "category": "electronic"
}

DELETE Request

Đúng như cái tên, nếu chúng ta cần xóa 1 tài nguyên từ API, chúng ta có thể sử dụng 1 DELETE request, ví dụ như thế này:

import requests

BASE_URL= 'https://fakestoreapi.com'

response = requests.delete(f"{BASE_URL}/products/21")
print(response.json())

Phương thức requests.delete() giúp chúng ta tạo 1 DELETE request trên /products/<product_id> endpoint.

 

Tổng kết

Qua bài viết này, Nhân Hòa đã giới thiệu cách để tương tác với API sử dụng các đoạn mã Python bằng thư viện requests. Còn rất nhiều điều mà Python có thể làm, hãy theo dõi tiếp ở Wiki Nhân Hòa.

 

Chúc các bạn luôn may mắn và thành công trong công việc!

Trả lời