HTTP (HyperText Transfer Protocol) là giao thức truyền tải dữ liệu giữa client và server. Mỗi yêu cầu HTTP được gửi đi bằng một phương thức cụ thể, mỗi phương thức có mục đích sử dụng riêng. Dưới đây là các phương thức HTTP phổ biến.
GET
- Mục đích: Lấy dữ liệu từ server.
- Tính chất: An toàn, idempotent (không làm thay đổi trạng thái của server), và có thể lưu cache.
- Ví dụ: Lấy thông tin từ một trang web, API hoặc tài liệu.
(Tất cả ví dụ code được viết bằng ngôn ngữpython3
và đã cài đặt thư việnrequests
)
import requests
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.get(url)
# Kiểm tra nếu yêu cầu thành công
if response.status_code == 200:
data = response.json()
print("Dữ liệu nhận được:", data)
else:
print("Yêu cầu GET không thành công. Mã lỗi:", response.status_code)
POST
- Mục đích: Gửi dữ liệu đến server để tạo một tài nguyên mới.
- Tính chất: Không idempotent (có thể gây ra thay đổi mỗi khi gọi).
- Ví dụ: Gửi dữ liệu biểu mẫu, tạo tài khoản mới hoặc thêm dữ liệu vào cơ sở dữ liệu.
import requests url = "https://jsonplaceholder.typicode.com/posts" data = { "title": "API POST Request", "body": "Đây là nội dung của bài viết", "userId": 1 } response = requests.post(url, json=data) if response.status_code == 201: print("Tạo thành công:", response.json()) else: print("Yêu cầu POST không thành công. Mã lỗi:", response.status_code)
PUT
- Mục đích: Cập nhật toàn bộ tài nguyên hiện có với dữ liệu mới.
- Tính chất: Idempotent (kết quả không thay đổi nếu yêu cầu được thực hiện nhiều lần).
- Ví dụ: Cập nhật hồ sơ người dùng với các thông tin mới.
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
updated_data = {
"id": 1,
"title": "API PUT Request",
"body": "Cập nhật toàn bộ nội dung bài viết",
"userId": 1
}
response = requests.put(url, json=updated_data)
if response.status_code == 200:
print("Cập nhật thành công:", response.json())
else:
print("Yêu cầu PUT không thành công. Mã lỗi:", response.status_code)
PATCH
- Mục đích: Cập nhật một phần của tài nguyên.
- Tính chất: Idempotent, nhưng chỉ cập nhật một phần chứ không toàn bộ tài nguyên.
- Ví dụ: Cập nhật một trường cụ thể của hồ sơ người dùng.
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
partial_update = {
"title": "Cập nhật tiêu đề bằng PATCH"
}
response = requests.patch(url, json=partial_update)
if response.status_code == 200:
print("Cập nhật thành công:", response.json())
else:
print("Yêu cầu PATCH không thành công. Mã lỗi:", response.status_code)
DELETE
- Mục đích: Xóa tài nguyên từ server.
- Tính chất: Idempotent.
- Ví dụ: Xóa một mục khỏi cơ sở dữ liệu.
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.delete(url)
if response.status_code == 200:
print("Xóa thành công.")
else:
print("Yêu cầu DELETE không thành công. Mã lỗi:", response.status_code)
OPTIONS
- Mục đích: Trả về các phương thức HTTP mà server hỗ trợ cho một URL cụ thể.
- Ví dụ: Kiểm tra xem server hỗ trợ các phương thức như GET, POST, v.v.
import requests
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.options(url)
print("Các phương thức hỗ trợ:", response.headers.get('Access-Control-Allow-Methods'))
HEAD
- Mục đích: Gửi một yêu cầu để lấy phần header của tài nguyên mà không cần tải toàn bộ nội dung.
- Tính chất: Giống với phương thức GET, nhưng server chỉ trả về các tiêu đề mà không gửi nội dung của tài nguyên.
- Ứng dụng: Kiểm tra thông tin như kích thước tài nguyên, thời gian sửa đổi cuối cùng hoặc kiểm tra nếu tài nguyên có sẵn mà không cần tải về toàn bộ dữ liệu.
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.head(url)
if response.status_code == 200:
print("Headers của tài nguyên:")
print(response.headers)
else:
print("Yêu cầu HEAD không thành công. Mã lỗi:", response.status_code)
TRACE
- Mục đích: Kiểm tra đường dẫn mà yêu cầu đi qua, chủ yếu dùng cho mục đích debug để xem các thay đổi hoặc sự sửa đổi qua từng proxy hoặc các lớp trung gian.
- Tính chất: Server sẽ phản hồi lại bằng dữ liệu mà client đã gửi để hiển thị toàn bộ đường đi của yêu cầu HTTP.
- Lưu ý: Do có thể bị lạm dụng để tấn công (như tấn công cross-site tracing – XST), phương thức này thường được vô hiệu hóa trên nhiều server vì lý do bảo mật.
import requests
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.request("TRACE", url)
if response.status_code == 200:
print("TRACE Response:", response.text)
else:
print("Yêu cầu TRACE không thành công. Mã lỗi:", response.status_code)
Khi chạy đoạn mã trên, bạn có thể nhận thấy rằng nhiều server từ chối hoặc không cho phép phương thức TRACE vì lý do bảo mật.
Tóm tắt
Phương thức | Mục đích | Tính chất | Ứng dụng phổ biến |
---|---|---|---|
GET | Lấy dữ liệu từ server. | An toàn, idempotent, có thể cache. | Lấy dữ liệu từ API, tải trang web hoặc tài liệu. |
POST | Gửi dữ liệu đến server để tạo tài nguyên mới. | Không idempotent (tạo tài nguyên mới mỗi lần gọi). | Gửi dữ liệu biểu mẫu, tạo tài khoản mới, thêm dữ liệu vào CSDL. |
PUT | Cập nhật toàn bộ tài nguyên hiện có với dữ liệu mới. | Idempotent (kết quả không thay đổi nếu gọi nhiều lần). | Cập nhật hồ sơ người dùng hoặc tài nguyên đã có. |
PATCH | Cập nhật một phần tài nguyên. | Idempotent, chỉ cập nhật một phần dữ liệu thay vì toàn bộ. | Cập nhật một trường cụ thể trong hồ sơ hoặc tài nguyên. |
DELETE | Xóa tài nguyên từ server. | Idempotent, thường không cần cache. | Xóa tài khoản người dùng, xóa mục khỏi cơ sở dữ liệu. |
HEAD | Lấy thông tin header của tài nguyên mà không tải nội dung. | An toàn, idempotent, hữu ích cho kiểm tra trạng thái tài nguyên. | Kiểm tra thông tin về kích thước, loại tài nguyên mà không tải dữ liệu. |
OPTIONS | Trả về các phương thức HTTP mà server hỗ trợ cho một URL cụ thể. | Idempotent, an toàn, thường không cache. | Kiểm tra các phương thức mà server hỗ trợ, như GET, POST, v.v. |
TRACE | Theo dõi đường đi của yêu cầu qua các lớp trung gian đến server. | An toàn, idempotent, nhưng thường bị vô hiệu hóa vì lý do bảo mật. | Dùng cho mục đích debug, kiểm tra các thay đổi của yêu cầu qua proxy. |
Lưu ý về tính chất
- An toàn: Không làm thay đổi trạng thái của server (GET, HEAD, OPTIONS, TRACE).
- Idempotent: Gọi nhiều lần cùng một yêu cầu sẽ không làm thay đổi kết quả cuối cùng (GET, PUT, DELETE, HEAD, OPTIONS, TRACE).