[HTTP Series] A Guide to the Most Common HTTP Requests

5 min read

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ện requests)
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ứcMục đíchTính chấtỨng dụng phổ biến
GETLấ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.
POSTGử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.
PUTCậ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ó.
PATCHCậ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.
DELETEXó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.
HEADLấ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.
OPTIONSTrả 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.
TRACETheo 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).

Link Series

[HTTP Series] Understanding the Basics of the HTTP Protocol

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *