Các phương thức trong HTTP Request

- Các phương thức HTTP Request
- Các đặc tính quan trọng của phương thức HTTP
- Các mã trạng thái phản hồi HTTP
- Cách dùng và ví dụ thực tế
- Phương thức GET (Lấy dữ liệu)
- Phương thức POST (Tạo mới dữ liệu)
- Phương thức PUT (Cập nhật toàn bộ)
- Phương thức PATCH (Cập nhật một phần)
- Phương thức DELETE (Xóa dữ liệu)
- Phương thức HEAD (Lấy thông tin Header)
- Phương thức OPTIONS (Kiểm tra quyền / CORS)
- Phương thức QUERY (Phương thức mới)
- Phương thức TRACE (Kiểm tra/Chẩn đoán đường đi)
- Phương thức PURGE (Xóa Cache thủ công)
- Lời kết
Trong kiến trúc RESTful API và giao tiếp Client – Server, HTTP Request Methods (hay còn gọi là HTTP Verbs) là các phương thức định nghĩa hành động mà phía Client muốn máy chủ (Server) thực thi đối với một tài nguyên (Resource) nhất định.
Việc sử dụng đúng phương thức không chỉ giúp hệ thống chuẩn hóa, dễ bảo trì mà còn nâng cao tính bảo mật và tối ưu hóa hiệu năng ứng dụng.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu các phương thức trong HTTP Request, các đặc tính quan trọng của chúng, các mã trạng thái thường gặp và cách chúng vận hành.
Các phương thức HTTP Request
Các phương thức phổ biến
GET: Dùng để lấy/đọc dữ liệu từ Server. Phương thức này không làm thay đổi trạng thái hệ thống (Safe & Idempotent). Dữ liệu gửi đi thường nằm ở đường dẫn (Query Parameters) và bị giới hạn độ dài URL (tùy theo từng trình duyệt). Có tính an toàn và bất biến.POST: Dùng để tạo mới một tài nguyên trên Server. Dữ liệu được gửi trong phần thân (Request Body). Phương thức này không có tính an toàn (Non-safe) và không có tính bất biến (Non-idempotent) (mỗi lần gửi yêu cầu sẽ tạo thêm một bản ghi mới).PUT: Dùng để cập nhật toàn bộ hoặc thay thế một tài nguyên hiện có. Nếu tài nguyên chưa tồn tại, nó có thể tạo mới (tùy thuộc vào thiết kế API).PATCH: Dùng để cập nhật một phần của tài nguyên (chỉ thay đổi các trường dữ liệu được chỉ định mà không thay thế toàn bộ).DELETE: Dùng để xóa một tài nguyên khỏi Server.HEAD: Tương tự nhưGET, nhưng Server chỉ trả về phần Header mà không trả về Body (thường dùng để kiểm tra sự tồn tại hoặc thông tin tệp tin).OPTIONS: Dùng để kiểm tra các phương thức HTTP được Server hỗ trợ cho một URL cụ thể (rất phổ biến trong xử lý CORS).
Các phương thức khác
QUERY: Đây là một phương thức mới ra mắt vào giữa năm 2026, cho phép gửi yêu cầu truy vấn/tìm kiếm dữ liệu kèm theo Request Body phức tạp (JSON, XML…) nhưng vẫn đảm bảo tính chất An toàn (Safe) và Có thể Cache (Cacheable) như phương thứcGET. Nó là sự kết hợp hoàn hảo giữaGETvàPOSTđể lấp đầy khoảng trống còn thiếu, phục vụ cho việc tìm kiếm nâng cao hoặc truy vấn AI.TRACE: Yêu cầu Server gửi lại chính xác Request nhận được (Echo back). Thường dùng để kiểm tra đường đi và chẩn đoán xem dữ liệu có bị biến đổi qua các Server Proxy/Gateway hay không (thường bị tắt trên Production vì lý do bảo mật).CONNECT: Yêu cầu Proxy Server thiết lập một đường ống kết nối mã hóa (Tunnel). Thường được trình duyệt tự động dùng khi kết nốiHTTPShoặcWebSocketqua một Proxy trung gian. Hiếm khi cần gọi thủ công qua Javascriptfetch().PURGE: Dùng để yêu cầu các hệ thống Cache trung gian (Varnish, CDN, Nginx…) xóa ngay một bản lưu Cache của tài nguyên. (Lưu ý: Đây là phương thức tùy chỉnh do các nhà cung cấp CDN/Cache định nghĩa, không nằm trong tiêu chuẩn HTTP chính thức của IETF/MDN).

Các đặc tính quan trọng của phương thức HTTP
Mỗi phương thức HTTP không chỉ định nghĩa hành động mà còn mang các đặc tính kỹ thuật cốt lõi giúp định hình cách Server xử lý Request và cách Trình duyệt / CDN tối ưu hóa hiệu năng:
- Safe (An toàn): Phương thức chỉ đọc dữ liệu từ Server, tuyệt đối không làm thay đổi trạng thái hay tạo ra bất kỳ tác dụng phụ (side-effect) nào đối với cơ sở dữ liệu.
- Idempotent (Bất biến / Đồng nhất): Dù bạn gửi yêu cầu 1 lần hay nhiều lần liên tiếp với cùng một dữ liệu, trạng thái kết quả cuối cùng trên Server vẫn không thay đổi so với lần gọi đầu tiên. Đặc tính này giúp hệ thống an toàn khi tự động gửi lại (retry) yêu cầu nếu gặp sự cố mạng.
- Cacheable (Có thể lưu Cache): Phản hồi (Response) từ yêu cầu có thể được Trình duyệt hoặc hệ thống trung gian (CDN, Proxy) lưu lại bản sao tạm thời để tái sử dụng, giúp tăng tốc độ tải trang ở các lần truy cập sau mà không cần xử lý lại trên Server.
Bảng tổng hợp các đặc tính HTTP Methods
| Phương thức | Safe (An toàn)? | Idempotent (Bất biến)? | Cacheable (Lưu Cache)? | Giải thích ngắn gọn |
GET | Có | Có | Có | Chỉ đọc dữ liệu, dễ dàng lưu cache ở phía Client/CDN. |
POST | Không | Không | Tùy điều kiện* | Tạo mới dữ liệu. Mỗi lần gửi sẽ tạo thêm bản ghi mới (sinh ra side-effect). |
PUT | Không | Có | Không | Thay thế toàn bộ tài nguyên. Gọi nhiều lần vẫn cho ra cùng 1 kết quả. |
PATCH | Không | Không* | Tùy điều kiện* | Cập nhật một phần. Tùy logic xử lý (ví dụ: views = views + 1 sẽ không bất biến). |
DELETE | Không | Có | Không | Xóa tài nguyên. Lần đầu xóa thành công, các lần sau dữ liệu vẫn là “đã bị xóa”. |
HEAD | Có | Có | Có | Lấy thông tin Header mà không tải Body, có thể lưu cache. |
OPTIONS | Có | Có | Không | Kiểm tra quyền/CORS của Server, không lưu cache. |
QUERY | Có | Có | Có | Truy vấn dữ liệu phức tạp bằng Body nhưng vẫn an toàn và lưu cache được. |
TRACE | Có | Có | Không | Gửi lại chính xác Request (echo back) để chẩn đoán hệ thống. |
CONNECT | Không | Không | Không | Thiết lập kết nối đường ống (Tunnel) qua Proxy. |
PURGE | Không | Có | Không | Yêu cầu chủ động xóa bản lưu Cache trên CDN/Proxy. |
* Ghi chú:
- Cacheable:
POSTvàPATCHchỉ có thể cache trong các trường hợp đặc biệt khi Server trả về Header chỉ định cụ thể (Cache-Control,Content-Location…). - Idempotent:
PATCHcó tính bất biến nếu bạn truyền dữ liệu thay thế cụ thể (như{"status": "active"}), nhưng sẽ không bất biến nếu thực hiện các phép tính cộng dồn (như{"score": score + 1}).
Các mã trạng thái phản hồi HTTP
Khi làm việc với HTTP Request, Server sẽ phản hồi kèm theo các mã trạng thái phản hồi (HTTP Response Status Code):
| Đầu số | Phân loại | Các mã phổ biến |
2xx | Thành công (Success) | 200 OK, 201 Created, 204 No Content |
3xx | Chuyển hướng (Redirection) | 301 Moved Permanently, 304 Not Modified |
4xx | Lỗi phía Client (Client Error) | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
5xx | Lỗi phía Server (Server Error) | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
Xem chi tiết các Status Code tại https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status.
Cách dùng và ví dụ thực tế
Dưới đây là ví dụ minh họa cách gọi tất cả các phương thức HTTP Request bằng JavaScript (sử dụng fetch API) để bạn có thể hiểu cách sử dụng:
Phương thức GET (Lấy dữ liệu)
// Lấy danh sách bài viết
fetch('https://api.domain.com/v1/posts')
.then(response => response.json())
.then(data => console.log('Danh sách bài viết:', data))
.catch(error => console.error('Lỗi:', error));
Phương thức GET không gửi Request Body, nên để truyền tham số (như lọc, phân trang, tìm kiếm đơn giản), bạn có 2 cách viết phổ biến bằng JavaScript:
Cách 1: Nối chuỗi trực tiếp vào URL (Đơn giản)
// Lấy trang 2, mỗi trang 10 bài, thuộc danh mục 'javascript'
const url = 'https://api.domain.com/v1/posts?page=2&limit=10&category=javascript';
fetch(url)
.then(response => response.json())
.then(data => console.log('Kết quả:', data));
⚠️ Cách này đơn giản tuy nhiên sẽ gây khó trong việc xác định vị trí các giá trị của param và có thể gây lỗi trong trường hợp giá trị truyền vào chứa khoảng trắng, các ký tự đặc biệt, tiếng Việt có dấu hay ký tự non-ASCII.
Ví dụ: bạn truyền một param search như bên dưới lỗi xảy ra:
- Dấu
#làm trình duyệt hiểu phần phía sau là Anchor link (thẻ định vị trang) chứ không gửi lên Server. - Dấu
&làm Server hiểu là tham sốsearchdừng ởHTTP, cònREST APIlà tham số tiếp theo.
const search = 'HTTP & REST API (Mới #1)'; const url = `https://api.domain.com/v1/posts?search=${search}`; // Kết quả URL: // https://api.domain.com/v1/posts?search=HTTP & REST API (Mới #1)
Cách 2: Dùng URLSearchParams (Chuẩn & Tự động Encode ký tự đặc biệt)
Bạn nên dùng cách này vì nó tự xử lý các ký tự đặc biệt (khoảng trắng, tiếng Việt, dấu #, &…) bằng cơ chế Percent-encoding (còn gọi là URL Encoding) giúp URL không bị lỗi. Việc truyền các param và giá trị theo định dạng object cũng giúp code dễ xem và dễ bảo trì hơn nối chuỗi của cách 1.
const baseUrl = 'https://api.domain.com/v1/posts';
// Tạo object chứa các tham số
const params = new URLSearchParams({
page: '1',
limit: '10',
search: 'HTTP Request & REST API', // Tự động đổi thành URL-encoded
sort: 'desc'
});
// Nối params vào URL -> https://api.domain.com/v1/posts?page=1&limit=10&search=HTTP+Request+%26+REST+API&sort=desc
fetch(`${baseUrl}?${params.toString()}`)
.then(response => response.json())
.then(data => console.log('Kết quả:', data))
.catch(error => console.error('Lỗi:', error));
Phương thức POST (Tạo mới dữ liệu)
// Tạo mới một bài viết
fetch('https://api.domain.com/v1/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'Các phương thức trong HTTP Request',
category: 'RESTful API'
})
})
.then(response => response.json())
.then(data => console.log('Đã tạo bài viết:', data))
.catch(error => console.error('Lỗi:', error));
Phương thức PUT (Cập nhật toàn bộ)
// Thay thế/Cập nhật toàn bộ bài viết có ID = 1
fetch('https://api.domain.com/v1/posts/1', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'Tiêu đề bài viết đã cập nhật',
content: 'Nội dung hoàn chỉnh mới...',
category: 'RESTful API'
})
})
.then(response => response.json())
.then(data => console.log('Cập nhật toàn bộ thành công:', data));
Phương thức PATCH (Cập nhật một phần)
// Chỉ cập nhật tiêu đề bài viết có ID = 1
fetch('https://api.domain.com/v1/posts/1', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'Chỉ đổi tên tiêu đề mới'
})
})
.then(response => response.json())
.then(data => console.log('Cập nhật một phần thành công:', data));
Phương thức DELETE (Xóa dữ liệu)
// Xóa bài viết có ID = 1
fetch('https://api.domain.com/v1/posts/1', {
method: 'DELETE'
})
.then(response => {
if (response.ok) {
console.log('Xóa bài viết thành công!');
}
});
Phương thức HEAD (Lấy thông tin Header)
// Kiểm tra Header (kích thước file, content-type...) mà không tải phần thân
fetch('https://api.domain.com/v1/posts', {
method: 'HEAD'
})
.then(response => {
console.log('Content-Type:', response.headers.get('content-type'));
console.log('Content-Length:', response.headers.get('content-length'));
});
Phương thức OPTIONS (Kiểm tra quyền / CORS)
Phương thức OPTIONS thường được trình duyệt tự động gửi đi (Preflight Request) để hỏi Server xem Client có quyền thực hiện các yêu cầu (POST, PUT, DELETE…) hay không.
// Kiểm tra các phương thức và Header mà Server hỗ trợ cho Endpoint này
fetch('https://api.domain.com/v1/posts', {
method: 'OPTIONS'
})
.then(response => {
// Đọc các phương thức được phép từ Header 'Allow' hoặc 'Access-Control-Allow-Methods'
console.log('Các phương thức được hỗ trợ:', response.headers.get('allow'));
console.log('CORS Allowed Methods:', response.headers.get('access-control-allow-methods'));
})
.catch(error => console.error('Lỗi:', error));
Phương thức QUERY (Phương thức mới)
// Truy vấn tìm kiếm nâng cao với Body phức tạp
fetch('https://api.domain.com/v1/posts/search', {
method: 'QUERY',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
filter: {
tags: ['javascript', 'http'],
date_range: { from: '2026-01-01', to: '2026-08-01' }
},
sort: 'created_at_desc'
})
})
.then(response => response.json())
.then(data => console.log('Kết quả tìm kiếm:', data));
Phương thức TRACE (Kiểm tra/Chẩn đoán đường đi)
// Kiểm tra Request qua chuỗi Proxy/Gateway
fetch('https://api.domain.com/v1/posts', {
method: 'TRACE'
})
.then(response => response.text())
.then(data => console.log('Nội dung Server nhận được:', data));
Phương thức PURGE (Xóa Cache thủ công)
// Yêu cầu CDN/Reverse Proxy xóa cache cho URL này
fetch('https://api.domain.com/v1/posts/1', {
method: 'PURGE'
})
.then(response => {
if (response.ok) {
console.log('Đã xóa cache thành công!');
}
});
Lời kết
Việc hiểu và vận dụng chính xác các phương thức HTTP Request là nền tảng quan trọng giúp bạn thiết kế RESTful API chuẩn chỉ, tối ưu và mở rộng tốt hơn. Đừng quên theo dõi sự phát triển của các tiêu chuẩn mới như phương thức QUERY để áp dụng hiệu quả vào dự án của mình!
Tài liệu tham khảo:


