4.1 Xử lý phản hồi
Module requests
cung cấp các phương thức tiện lợi để
làm việc với phản hồi từ server.
Mã trạng thái
Ngoài phản hồi, server còn gửi mã trạng thái của yêu cầu.
Thông tin về trạng thái được chứa trong các trường
status_code
và reason
. Ví dụ dưới đây:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Hiển thị mã trạng thái của phản hồi
print(response.reason) # Hiển thị mô tả văn bản của trạng thái
print(response.ok) # Trả về True nếu mã trạng thái nhỏ hơn 400
Headers
Vâng, tất nhiên không có HTTP request nào mà không có headers đúng không? Nếu bạn cần
headers của request hay response, bạn có thể truy cập chúng qua
trường headers
:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Hiển thị headers của phản hồi
print(response.headers['Content-Type']) # Hiển thị giá trị của một header cụ thể
Nội dung phản hồi
Phản hồi từ server có thể chứa byte, text, json
hoặc xml
. Nếu
bạn biết chính xác mình đang yêu cầu từ server, bạn có thể ngay lập tức
nhận đối tượng loại cần thiết bằng cách sử dụng một trong các
phương thức/trường:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Hiển thị nội dung phản hồi dưới dạng text
print(response.json()) # Hiển thị nội dung phản hồi dưới dạng JSON
print(response.content) # Hiển thị nội dung phản hồi dưới dạng bytes
Bạn sẽ tìm hiểu chi tiết hơn về headers (headers)
và mã trạng thái phản hồi trong các
bài giảng về cấu trúc mạng.
4.2 Xử lý lỗi
Module requests
cung cấp ngoại lệ cho
việc xử lý lỗi.
Tiêu chuẩn HTTP không bao hàm ngoại lệ, thay vào đó nó hoạt động
với mã lỗi (status_code)
. Nếu bạn muốn, kết quả của
một request thất bại sẽ sinh ra ngoại lệ Python, bạn cần
explicitly gọi hàm raise_for_status()
.
Ví dụ:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Sinh ngoại lệ cho mã trạng thái 4xx và 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Bạn có thể tìm hiểu chi tiết hơn về mã lỗi trong các bài giảng về cấu trúc mạng.
4.3 Gửi dữ liệu
Trước khi JSON xuất hiện, khối lượng dữ liệu lớn được gửi đi
thông qua «form». Form – là một đối tượng đặc biệt trên trang trình duyệt (và
chuẩn dữ liệu trong HTTP). Nếu bạn muốn gửi dữ liệu
«thông qua form», bạn chỉ cần gửi kèm theo request tham số data
.
Lưu ý!
GET requests không hỗ trợ
form vì không chứa nội dung request. Tất cả dữ liệu của chúng được gửi
chỉ trong URL.
Gửi dữ liệu trong GET request
Trong GET request
dữ liệu được gửi qua tham số URL. Đây là ví dụ:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Hiển thị URL với các tham số thêm vào
Gửi dữ liệu form
Chúng ta sẽ sử dụng POST request
, để gửi dữ liệu tới server.
Ví dụ:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Gửi files
Nếu bạn muốn gửi dữ liệu nhị phân lên mạng, chẳng hạn như
tải lên một bức ảnh, thì bạn cần gửi file của mình hoặc các file
trong request bằng cách sử dụng tham số files
.
Ví dụ:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Dễ như ăn cháo. Nếu muốn gửi nhiều file, hãy
liệt kê chúng dưới bất kỳ tên nào trong biến
files
.
Lưu ý!
Đừng quên đóng file sau khi gửi, để tránh rò rỉ tài nguyên.
Tốt nhất là hãy sử dụng cấu trúc with
, để tự động đóng file sau khi hoàn thành thao tác:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Đăng nhập và xác thực
API (Application Programming Interface) – là tập hợp các quy tắc và các giao thức, cho phép các chương trình khác nhau tương tác với nhau. Rất nhiều trang web và dịch vụ cho phép gửi request và làm việc với API của chúng chỉ sau khi đăng nhập.
Sau khi đăng nhập thành công bạn nhận được một đối tượng đặc biệt – session (session)
, chứa số duy nhất của
«phiên làm việc được xác thực với server». Đối với các request tiếp theo, bạn cần sử dụng đối tượng này.
Xác thực
Để đăng nhập vào server, bạn cần thông qua xác thực (quá trình đăng nhập), cho điều này bạn cần gửi với request thông tin đăng nhập.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
Đây là cách quá trình xác thực diễn ra, nhưng thông thường nó được sử dụng cùng với session.
Sử dụng sessions
Sessions cho phép lưu các tham số giữa các request, như cookies
hoặc thông tin xác thực
người dùng.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Tạo session
session = requests.Session()
# Đăng nhập vào trang
login_response = session.post('https://example.com/login', data = payload)
# Tiếp tục làm việc với phiên người dùng đã đăng nhập
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION