Courses
API, hay giao diện lập trình ứng dụng, thực sự là những người hùng của phát triển phần mềm hiện đại. Chúng cho phép các hệ thống phần mềm khác nhau giao tiếp với nhau, giúp tích hợp dịch vụ và xây dựng ứng dụng trở nên khả thi. Thành thạo API là một kỹ năng quan trọng cho bất kỳ ai muốn làm việc với dữ liệu trong Python, đặc biệt nếu bạn là nhà phát triển. Bạn có thể sẽ bất ngờ trước những cánh cửa mở ra: khi nắm được kỹ năng này, bạn có thể xây dựng ứng dụng web, kết nối với các dịch vụ bên ngoài, hoặc thậm chí sử dụng dữ liệu thời gian thực trong các dự án máy học.
Trong hướng dẫn này, chúng ta sẽ khám phá thế giới API, học cách sử dụng chúng trong Python, cách tự xây dựng API với FastAPI, và cách xử lý những thách thức thường gặp chắc chắn sẽ xuất hiện. Kết thúc hướng dẫn, bạn sẽ có nền tảng vững chắc về cách sử dụng API trong các dự án của mình, giúp quy trình phát triển hiệu quả hơn và ứng dụng mạnh mẽ hơn. Nếu bạn cảm thấy quá tải với lượng thông tin, hãy thử khóa học Giới thiệu về API trong Python của chúng tôi, nơi giải thích chi tiết từng phần.
API là gì?
API giống như một cây cầu giữa các ứng dụng phần mềm khác nhau. Nó cho phép các ứng dụng này giao tiếp và chia sẻ thông tin với nhau.
Hãy hình dung API như một người phục vụ trong nhà hàng. Bạn nói với người phục vụ bạn muốn gì (gọi món), và họ truyền đạt yêu cầu của bạn đến nhà bếp. Nhà bếp chuẩn bị món ăn, và người phục vụ mang lại cho bạn. Tương tự, bạn gửi một yêu cầu đến API, nó xử lý yêu cầu và trả về kết quả.
Để cụ thể hơn, hãy xét vài trường hợp thực tế: Bạn có thể sử dụng API công khai để truy xuất dữ liệu tài chính phục vụ phân tích thị trường chứng khoán hoặc truy cập dữ liệu thời tiết thời gian thực cho mô hình dự báo khí hậu. Như bạn thấy, API đặc biệt quan trọng khi làm việc với các bộ dữ liệu lớn và/hoặc khi bạn cần dữ liệu thời gian thực; nếu không, việc tích hợp có thể không quá khó khăn.

Cách một API Python hoạt động. Hình ảnh bởi Napkin.AI
Sử dụng API trong Python
Sử dụng API trong Python là cách mạnh mẽ để tương tác với các dịch vụ bên ngoài, truy xuất dữ liệu và tích hợp nhiều chức năng vào ứng dụng của bạn. Python giúp làm việc với API đơn giản và hiệu quả, chủ yếu thông qua thư viện requests, cho phép bạn gửi các yêu cầu HTTP để tương tác với API.
Giới thiệu về API trong Python
Trong Python, tương tác với API là quy trình khá trực quan nhờ thư viện requests. Thư viện này đơn giản hóa việc gửi các yêu cầu HTTP, cho phép bạn giao tiếp với API và truy xuất hoặc gửi dữ liệu.
Gửi yêu cầu API trong Python
Trước khi bắt đầu gửi yêu cầu API trong Python, bạn sẽ cần thư viện requests. Bạn có thể cài đặt bằng lệnh sau:
pip install requestsNhững điều cơ bản về yêu cầu API
Hãy kết nối ví dụ nhà hàng ở trên với những gì thực sự xảy ra trong Python. Dưới đây là phần tóm tắt đơn giản:
Tìm đúng địa chỉ: Xác định endpoint của API, tức địa chỉ web cụ thể nơi bạn sẽ gửi yêu cầu.
Đặt món của bạn: Sử dụng thư viện
requestscủa Python để gửi yêu cầu đến API. Bạn sẽ chỉ định loại hành động muốn thực hiện (như lấy dữ liệu hoặc gửi dữ liệu).Nhận món ăn: API sẽ trả về phản hồi, bạn có thể xử lý để trích xuất thông tin cần thiết.
Yêu cầu GET
GET là loại yêu cầu HTTP phổ biến nhất dùng để truy xuất dữ liệu từ máy chủ, tương tự như yêu cầu thông tin; khi bạn nhập URL vào trình duyệt và nhấn enter, về cơ bản bạn đang gửi một yêu cầu GET đến máy chủ đó, chỉ định tài nguyên mong muốn, máy chủ sẽ xử lý để tìm và chuẩn bị dữ liệu được yêu cầu rồi gửi lại theo định dạng như JSON hoặc XML.
import requestsresponse = requests.get('https://api.example.com/data')data = response.json()print(data)Trong ví dụ này, chúng ta gửi yêu cầu GET đến một API giả định và in phản hồi JSON. GET thường được dùng để lấy dữ liệu mà không chỉnh sửa nó.
Yêu cầu POST
Trong khi GET dùng để truy xuất dữ liệu, POST gửi chỉ thị đến máy chủ. Chúng thường được dùng để tạo tài nguyên mới (như thêm người dùng) hoặc cập nhật tài nguyên hiện có (như chỉnh sửa hồ sơ).
Hãy tưởng tượng bạn điền một biểu mẫu trực tuyến để đăng ký dịch vụ. Khi bạn nhấn gửi, về bản chất bạn đang gửi một yêu cầu POST kèm thông tin của mình. Dưới đây là ví dụ đơn giản:
# Data to send (like user information)data = {'name': 'John Doe', 'email': '[email protected]'}# Send the data to the API (replace the URL with the actual API endpoint)response = requests.post('https://api.example.com/users', json=data)# Check if the request was successful (usually a status code of 201 for creation)if response.status_code == 201: print("User created successfully!")else: print("Error:", response.status_code)Ví dụ này gửi một dictionary chứa thông tin người dùng dưới dạng dữ liệu JSON tới API. Sau đó, chúng ta kiểm tra mã trạng thái phản hồi để xem người dùng có được tạo thành công hay không.
Xử lý phản hồi
Khi bạn gửi yêu cầu API, máy chủ sẽ trả về phản hồi gồm hai thành phần chính:
- Mã trạng thái: Một con số cho biết yêu cầu thành công hay thất bại. Ví dụ, 200 thường nghĩa là thành công, trong khi 404 nghĩa là không tìm thấy tài nguyên.
- Dữ liệu: Thông tin bạn yêu cầu, thường ở định dạng JSON. Đây là phần chứa nội dung giá trị.
Ví dụ Python như sau:
response = requests.get('https://api.example.com/data')if response.status_code == 200: data = response.json() print(data) else: print(f"Request failed with status code {response.status_code}") Tìm hiểu mã trạng thái API trong Python
Mã trạng thái API là các phản hồi chuẩn hóa mà máy chủ gửi lại để chỉ ra kết quả của yêu cầu từ phía máy khách. Những mã này giúp nhà phát triển hiểu liệu yêu cầu đã thành công, xảy ra lỗi, hay cần hành động bổ sung.
Các mã trạng thái thường gặp
200 OK: Mã này cho biết yêu cầu thành công. Ví dụ, khi bạn gửi yêu cầu GET để lấy dữ liệu từ API, phản hồi
200 OKnghĩa là dữ liệu đã được lấy đúng.
404 Not Found: Mã này trả về khi máy chủ không tìm thấy tài nguyên được yêu cầu. Chẳng hạn, nếu bạn cố truy cập một endpoint không tồn tại, bạn sẽ nhận lỗi
404 Not Found.
500 Internal Server Error: Mã này báo hiệu có sự cố ở phía máy chủ. Đây là thông điệp lỗi chung có thể xảy ra do nhiều nguyên nhân, như lỗi trong mã máy chủ hoặc vấn đề với cơ sở dữ liệu.
Xử lý các mã trạng thái khác nhau
Xử lý hiệu quả mã trạng thái API trong ứng dụng Python giúp mã của bạn hoạt động ổn định và xử lý lỗi khéo léo. Nếu phản hồi là 200, hãy tiếp tục xử lý dữ liệu trả về. Khi gặp lỗi 404, kiểm tra xem URL endpoint đã đúng chưa, và nếu cần, triển khai logic dự phòng hoặc thông báo cho người dùng rằng tài nguyên không khả dụng. Với lỗi 500, hãy cân nhắc thử gửi lại yêu cầu sau một khoảng trễ ngắn hoặc ghi log lỗi để điều tra thêm. Tuy nhiên, tránh thử lại quá nhiều lần để không làm quá tải máy chủ.
Xây dựng API bằng Python
Xây dựng API với Python cho phép bạn tạo ra các giao diện ứng dụng mạnh mẽ và hiệu quả. Sự đơn giản của Python và hệ sinh thái thư viện phong phú khiến nó trở thành lựa chọn tuyệt vời cho phát triển API.
Giới thiệu về FastAPI
Giờ bạn đã biết cách sử dụng API, hãy khám phá cách chúng ta có thể tự xây dựng. FastAPI là một framework web hiện đại, nhanh (hiệu năng cao) để xây dựng API với Python. Đúng như tên gọi, nó được thiết kế để dễ sử dụng. Một điểm tôi thích ở FastAPI là nó cũng tự động tạo tài liệu tương tác.
Thiết lập FastAPI
Để bắt đầu, bạn cần cài đặt Python và trình quản lý gói pip. Sau đó, cài FastAPI và Uvicorn, một máy chủ ASGI hiệu năng cao:
pip install fastapi uvicornLưu ý nhỏ: Nếu bạn gặp vấn đề với việc thiết lập Python hoặc pip, hãy xem hướng dẫn: Cách nâng cấp Python và Pip trên Windows, macOS và Linux.
Tạo một API đơn giản
Hãy xây dựng một API đơn giản trả về lời chào:
from fastapi import FastAPIapp = FastAPI()@app.get("/")def read_root(): return {"Hello": "World"}Để khởi chạy API này, thực thi lệnh sau:
uvicorn main:app --reloadLệnh này khởi động máy chủ Uvicorn, phục vụ API của bạn tại http://127.0.0.1:8000. Truy cập URL này trong trình duyệt sẽ trả về phản hồi {"Hello": "World"}.
Tính năng nâng cao của FastAPI
FastAPI không chỉ giúp tạo API đơn giản một cách nhanh chóng; nó còn cung cấp nhiều tính năng nâng cao, phù hợp cho các ứng dụng phức tạp và hiệu năng cao. Dưới đây là vài khả năng chính:
Tham số truy vấn
Trong FastAPI, việc thêm và xử lý tham số truy vấn rất đơn giản nhờ dựa vào type hints của Python. Tham số truy vấn là một phần của URL và được dùng để truyền dữ liệu tùy chọn tới endpoint API, thường nhằm lọc hoặc điều chỉnh dữ liệu trả về.
Thêm tham số truy vấn
Để thêm tham số truy vấn trong FastAPI, bạn chỉ cần định nghĩa nó như một đối số hàm trong hàm xử lý đường dẫn. Nếu tham số là tùy chọn, bạn có thể gán giá trị mặc định như None. Ví dụ, giả sử bạn có một endpoint truy xuất các mục từ cơ sở dữ liệu. Bạn muốn cho phép người dùng lọc các mục theo chuỗi tìm kiếm:
app = FastAPI()@app.get("/items/")def read_items(q: str = None): if q: return {"items": ["Item 1", "Item 2", "Item 3"], "query": q} return {"items": ["Item 1", "Item 2", "Item 3"]}Trong ví dụ này, q là tham số truy vấn tùy chọn. Nếu chúng ta cung cấp giá trị cho q, kết quả sẽ được lọc theo truy vấn đó. Nếu không cung cấp q, endpoint trả về tất cả các mục.
Xử lý tham số truy vấn
FastAPI tự động xử lý tham số truy vấn, bao gồm kiểm tra và chuyển đổi kiểu. Ví dụ, nếu bạn chỉ định tham số truy vấn là số nguyên, FastAPI sẽ xác thực rằng đầu vào thực sự là số nguyên. Nếu đầu vào không khớp kiểu mong đợi, FastAPI trả về thông báo lỗi rõ ràng.
Dưới đây là ví dụ với tham số truy vấn bắt buộc và kiểm tra kiểu:
@app.get("/items/{item_id}")def read_item(item_id: int, q: str = None): return {"item_id": item_id, "query": q}Trong trường hợp này, item_id là tham số đường dẫn, còn q là tham số truy vấn tùy chọn. FastAPI sẽ đảm bảo item_id là số nguyên và sẽ xử lý tham số truy vấn q nếu được cung cấp.
Xử lý các phương thức HTTP khác nhau
Triển khai các phương thức HTTP như GET, POST, PUT và DELETE rất đơn giản và tương tự cách bạn định nghĩa route trong các framework khác. Mỗi phương thức gắn với một kiểu thao tác cụ thể, như truy xuất dữ liệu (GET), tạo dữ liệu mới (POST), cập nhật dữ liệu hiện có (PUT), hoặc xóa dữ liệu (DELETE).
Phương thức GET
Phương thức GET dùng để truy xuất dữ liệu từ máy chủ. Trong FastAPI, bạn định nghĩa một endpoint GET như sau:
@app.get("/items/")def get_items(): return {"items": ["Item 1", "Item 2", "Item 3"]}Phương thức POST
Phương thức POST dùng để tạo dữ liệu mới. Bạn có thể định nghĩa endpoint POST và nhận dữ liệu trong phần thân yêu cầu:
@app.post("/items/")def create_item(item: dict): return {"item": item}Phương thức PUT
Phương thức PUT dùng để cập nhật dữ liệu hiện có. Thường cần cả định danh và dữ liệu mới:
@app.put("/items/{item_id}")def update_item(item_id: int, item: dict): return {"item_id": item_id, "updated_item": item}Phương thức DELETE
Phương thức DELETE dùng để xóa dữ liệu. Trong FastAPI, một endpoint DELETE được định nghĩa như sau:
@app.delete("/items/{item_id}")def delete_item(item_id: int): return {"message": f"Item {item_id} deleted"}Xác thực và bảo mật
FastAPI cung cấp nhiều cơ chế để triển khai xác thực và bảo mật:
- HTTP Basic Auth: Phương pháp đơn giản, nhưng nhìn chung không khuyến nghị cho môi trường sản xuất do lo ngại bảo mật.
- API Keys: Tùy chọn an toàn hơn, liên quan đến việc tạo các khóa duy nhất cho khách hàng.
- OAuth 2.0: Tiêu chuẩn ủy quyền phức tạp nhưng mạnh mẽ, thường dùng cho tích hợp bên thứ ba.
- JSON Web Tokens (JWT): Cách tiếp cận phổ biến để biểu diễn các tuyên bố một cách an toàn giữa hai bên.
Các lưu ý về hiệu năng API Python
Hãy cùng xem xét một số lưu ý về hiệu năng của API Python.
Hiệu quả của các yêu cầu API
Hiệu quả của các yêu cầu API có thể ảnh hưởng đáng kể đến hiệu năng tổng thể của ứng dụng. Các phương thức yêu cầu API khác nhau có độ phức tạp thời gian khác nhau:
- Yêu cầu GET: Thường nhanh, vì được thiết kế để truy xuất dữ liệu mà không gây thay đổi trên máy chủ. Tuy nhiên, hiệu năng có thể giảm khi dữ liệu rất lớn.
- Yêu cầu POST: Có thể mất nhiều thời gian hơn vì liên quan đến việc gửi dữ liệu lên máy chủ để xử lý hoặc lưu trữ.
- Yêu cầu PUT và DELETE: Độ phức tạp thời gian có thể thay đổi tùy thuộc vào thời gian phản hồi của máy chủ và các thao tác được thực hiện.
Để nâng cao hiệu quả, hãy giảm thiểu kích thước dữ liệu được gửi hoặc truy xuất, và cân nhắc sử dụng các thao tác theo lô khi có thể.
Tối ưu hóa việc sử dụng API
Dưới đây là một số mẹo để tối ưu hiệu năng các lời gọi API trong Python:
- Gộp yêu cầu (Batch Requests): Kết hợp nhiều lời gọi API thành một yêu cầu khi có thể để giảm chi phí phụ trội.
- Bộ nhớ đệm phản hồi: Lưu trữ cục bộ dữ liệu thường được yêu cầu để giảm số lần gọi API.
- Yêu cầu bất đồng bộ: Sử dụng các thư viện bất đồng bộ như
aiohttpđể xử lý đồng thời nhiều yêu cầu, giảm thời gian chờ. - Tái sử dụng kết nối (Connection Pooling): Tái sử dụng kết nối thay vì tạo kết nối mới cho mỗi yêu cầu, giúp giảm độ trễ.
Những lỗi API Python thường gặp và cách xử lý
Khi làm việc với API, bạn có thể gặp nhiều lỗi làm gián đoạn chức năng của ứng dụng. Dưới đây là hai vấn đề phổ biến và cách xử lý hiệu quả.
Xử lý lỗi timeout
Lỗi timeout xảy ra khi yêu cầu API không nhận được phản hồi trong thời gian cho phép. Những lỗi này có thể do nhiều yếu tố, bao gồm tắc nghẽn mạng, máy chủ quá tải, xử lý dữ liệu tốn thời gian, hoặc giới hạn tốc độ của API. Để khắc phục, nên áp dụng các chiến lược như tăng thời gian chờ, sử dụng cơ chế thử lại theo cấp số nhân (exponential backoff), tối ưu payload của yêu cầu và áp dụng lập trình bất đồng bộ. Việc triển khai xử lý lỗi và ghi log bài bản cũng hữu ích để xác định nguyên nhân timeout và đưa ra biện pháp khắc phục cần thiết.
Quản lý giới hạn tần suất (rate limit)
Nhiều API áp dụng giới hạn tần suất nhằm ngăn lạm dụng, đảm bảo sử dụng công bằng và duy trì ổn định dịch vụ. Các giới hạn này, thường được biểu thị theo số yêu cầu mỗi phút hoặc giờ, đặt trần cho tổng số yêu cầu trong một khoảng thời gian nhất định. Nếu vượt ngưỡng, bạn có thể bị chặn tạm thời, phản hồi chậm, hoặc bị từ chối truy cập API. Hãy sử dụng các kỹ thuật như exponential backoff, tận dụng bộ nhớ đệm và theo dõi chặt chẽ mức sử dụng API để kiểm soát giới hạn. Việc hiểu rõ chính sách rate limit cụ thể của API là điều thiết yếu để tránh gián đoạn dịch vụ.
Các lựa chọn thay thế cho yêu cầu API chuẩn
Mặc dù API là phương thức tiêu chuẩn để truy cập dữ liệu, vẫn có những tình huống các lựa chọn thay thế có thể phù hợp hơn. Dưới đây là hai lựa chọn thay thế phổ biến cho việc sử dụng yêu cầu API chuẩn trong Python.
Sử dụng web scraping
Khi API không khả dụng, không đủ, hoặc không thực tiễn, web scraping là kỹ thuật trích xuất dữ liệu từ website. Bằng cách xử lý HTML, bạn có thể thu thập thông tin có thể không có sẵn theo cách khác. Tuy nhiên, điều quan trọng là tuân thủ điều khoản sử dụng của website, tránh làm quá tải máy chủ, và cân nhắc khía cạnh pháp lý, đạo đức. Các thư viện Python nổi tiếng như BeautifulSoup, Scrapy và Selenium giúp việc web scraping trở nên dễ dàng hơn.
Truy cập cơ sở dữ liệu trực tiếp
Truy cập cơ sở dữ liệu trực tiếp mang lại cách tiếp cận trực tiếp và tiềm năng nhanh hơn để truy xuất dữ liệu so với API. Nếu bạn có quyền cần thiết và hiểu rõ cấu trúc cơ sở dữ liệu, bạn có thể bỏ qua các giới hạn của API và thực thi truy vấn tùy chỉnh bằng các công cụ như SQLAlchemy hoặc psycopg2. Tuy nhiên, phương pháp này đòi hỏi cân nhắc kỹ về bảo mật, hiệu năng và tính toàn vẹn dữ liệu, vì tương tác trực tiếp với cơ sở dữ liệu có thể tạo ra lỗ hổng nếu không xử lý đúng cách.
Kết luận
Giờ đây bạn đã nắm được những điều cơ bản về tạo và sử dụng API, bao gồm cách dùng framework linh hoạt FastAPI. Bạn cũng biết cách vượt qua các trở ngại thường gặp như giới hạn tần suất và timeout. Tương tác API hiệu quả là yếu tố cốt lõi trong phát triển Python hiện đại, vì nó cho phép bạn khai thác các bộ dữ liệu lớn và xây dựng những giải pháp sáng tạo.
Tất nhiên, quy trình luôn thay đổi. Chìa khóa để trở thành chuyên gia là thử nghiệm, học hỏi liên tục và áp dụng trong thực tế. Đây là lý do DataCamp đầu tư rất nhiều vào các tài nguyên như khóa học Giới thiệu về API trong Python để bạn có thể thực hành và trở thành chuyên gia thực thụ. Ngoài ra, khóa Ingestion dữ liệu tinh gọn với pandas cũng là một lựa chọn tuyệt vời. Hãy đăng ký ngay hôm nay!
Nhà viết nội dung về công nghệ, chuyên về AI, ML và khoa học dữ liệu, giúp làm rõ và phổ biến những ý tưởng phức tạp.
