Khi làm việc với các dịch vụ web, việc gửi và nhận dữ liệu bảo mật là rất quan trọng. Thông qua HTTPS (Hypertext Transfer Protocol Secure), giao thức này giúp mã hóa kết nối của bạn với máy chủ để bảo vệ dữ liệu. Một phần quan trọng trong quá trình này là xác minh chứng chỉ SSL của máy chủ đích.
Xác Minh Chứng Chỉ SSL
Thư viện Requests trong Python thực hiện việc xác minh chứng chỉ SSL mặc định. Điều này đảm bảo kết nối của bạn với các dịch vụ web an toàn hơn. Tuy nhiên, trong một số trường hợp bạn có thể muốn thay đổi hành vi này.
Nếu bạn muốn tắt tính năng xác minh SSL, bạn có thể truyền tham số False
vào tham số verify
trong hàm yêu cầu:
import requests
requests.get("https://api.github.com", verify=False)
Khi thực hiện yêu cầu như vậy, bạn sẽ nhận được cảnh báo về yêu cầu không xác minh SSL:
InsecureRequestWarning: Unverified HTTPS request is being made to host 'api.github.com'. Adding certificate verification is strongly advised.
Lưu ý rằng thư viện Requests sử dụng gói certifi để cung cấp các cơ quan chứng nhận (CAs) mà Requests có thể tin cậy. Vì vậy, bạn nên cập nhật certifi thường xuyên để đảm bảo kết nối của mình luôn an toàn.
Tăng Cường Hiệu Suất với Requests
Khi sử dụng Requests, đặc biệt là trong môi trường ứng dụng sản xuất, hiệu suất là một yếu tố cần được xem xét. Các tính năng như điều khiển thời gian chờ, session và giới hạn thử lại có thể giúp bạn tối ưu hóa ứng dụng của mình.
Thời Gian Chờ (Timeout)
Khi bạn gửi yêu cầu đến một dịch vụ ngoài, hệ thống của bạn sẽ phải đợi phản hồi từ dịch vụ đó. Nếu ứng dụng của bạn đợi quá lâu, các yêu cầu có thể bị tắc nghẽn, trải nghiệm người dùng có thể bị ảnh hưởng hoặc các công việc nền có thể bị treo.
Theo mặc định, Requests sẽ đợi phản hồi vô thời hạn. Vì vậy, bạn nên luôn chỉ định thời gian chờ để tránh những vấn đề này. Để cài đặt thời gian chờ, bạn sử dụng tham số timeout
. timeout
có thể là một số nguyên hoặc số thực, thể hiện số giây để đợi phản hồi trước khi hết thời gian:
requests.get("https://api.github.com", timeout=1)
requests.get("https://api.github.com", timeout=3.05)
Trong yêu cầu đầu tiên, yêu cầu sẽ hết thời gian sau 1 giây. Trong yêu cầu thứ hai, yêu cầu sẽ hết thời gian sau 3.05 giây.
Ngoài ra, bạn cũng có thể truyền một bộ giá trị timeout
với hai phần tử:
- Thời gian kết nối: Thời gian cho phép để client kết nối với server.
- Thời gian đọc: Thời gian mà client sẽ đợi phản hồi sau khi kết nối đã được thiết lập.
Ví dụ:
requests.get("https://api.github.com", timeout=(3.05, 5))
Trong ví dụ trên, nếu kết nối được thiết lập trong 3.05 giây và nhận được dữ liệu trong vòng 5 giây từ khi kết nối, phản hồi sẽ được trả về. Nếu không, sẽ có ngoại lệ Timeout
:
import requests
from requests.exceptions import Timeout
try:
response = requests.get("https://api.github.com", timeout=(3.05, 5))
except Timeout:
print("Yêu cầu đã hết thời gian chờ")
else:
print("Yêu cầu không bị hết thời gian chờ")
Sử Dụng Session để Quản Lý Kết Nối
Cho đến nay, bạn đã làm việc với các hàm yêu cầu cao cấp như get()
và post()
. Tuy nhiên, Requests còn cung cấp một lớp gọi là Session giúp bạn tùy chỉnh và cải thiện hiệu suất của các yêu cầu HTTP.
Sessions cho phép bạn duy trì các thông số (như thông tin xác thực) qua các yêu cầu khác nhau. Ví dụ, nếu bạn muốn sử dụng cùng một thông tin xác thực cho nhiều yêu cầu, bạn có thể sử dụng session:
import requests
from custom_token_auth import TokenAuth
TOKEN = "<YOUR_GITHUB_PA_TOKEN>"
with requests.Session() as session:
session.auth = TokenAuth(TOKEN)
first_response = session.get("https://api.github.com/user")
second_response = session.get("https://api.github.com/user")
print(first_response.headers)
print(second_response.json())
Trong đoạn mã trên, bạn đăng nhập một lần và thực hiện nhiều yêu cầu đã xác thực mà không cần phải nhập lại thông tin xác thực.
Lợi ích lớn nhất của Session là khả năng duy trì kết nối. Khi ứng dụng của bạn kết nối đến một server qua Session, kết nối đó sẽ được giữ lại trong một connection pool. Khi bạn kết nối lại với cùng một server, nó sẽ tái sử dụng kết nối này thay vì thiết lập một kết nối mới.
Retry (Thử Lại) Các Yêu Cầu
Khi một yêu cầu thất bại, có thể bạn muốn ứng dụng của mình tự động thử lại yêu cầu đó. Tuy nhiên, mặc định Requests không thực hiện điều này. Để làm điều này, bạn cần sử dụng Transport Adapter tùy chỉnh.
Transport Adapter cho phép bạn cấu hình các tham số retry cho mỗi dịch vụ bạn tương tác. Ví dụ, nếu bạn muốn tất cả các yêu cầu đến https://api.github.com
thử lại hai lần trước khi báo lỗi, bạn có thể tạo một adapter, thiết lập tham số max_retries
và gắn nó vào Session:
import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import RetryError
github_adapter = HTTPAdapter(max_retries=2)
session = requests.Session()
session.mount("https://api.github.com", github_adapter)
try:
response = session.get("https://api.github.com/")
except RetryError as err:
print(f"Lỗi: {err}")
finally:
session.close()
Trong ví dụ trên, bạn đã cấu hình Session sao cho nó sẽ thử lại tối đa hai lần khi yêu cầu đến API của GitHub không thành công.
Kết Luận
Thư viện Requests trong Python cung cấp những công cụ mạnh mẽ để làm việc với các yêu cầu HTTP và giúp bạn dễ dàng xử lý các tình huống như xác minh SSL, tối ưu hiệu suất, quản lý session và retry yêu cầu. Bằng cách áp dụng các kỹ thuật này, bạn có thể xây dựng các ứng dụng hiệu quả và đáng tin cậy hơn.