Sự Khác Biệt Giữa PUT và PATCH Trong RESTful API
Khi xây dựng RESTful API, việc cập nhật các tài nguyên hiện có là điều phổ biến. Hai phương thức HTTP thường được sử dụng cho mục đích này là PUT và PATCH. Dù cả hai đều có chức năng sửa đổi dữ liệu, nhưng chúng phục vụ cho các mục đích khác nhau mà không phải ai cũng nắm rõ.
Bài viết này sẽ giải thích chi tiết sự khác biệt giữa yêu cầu PUT và PATCH, đồng thời cung cấp ví dụ cụ thể và hướng dẫn để giúp bạn lựa chọn phương pháp phù hợp cho API của mình.
1. Yêu Cầu PUT
1.1. Định Nghĩa của PUT
Yêu cầu PUT được sử dụng để cập nhật hoặc tạo tài nguyên trên máy chủ. Cách dễ hiểu nhất là coi PUT như một hành động thay thế toàn bộ tài nguyên bằng một phiên bản mới hơn. Yêu cầu này bao gồm toàn bộ đại diện của tài nguyên và máy chủ sẽ thay thế tài nguyên hiện có bằng tài nguyên được cung cấp trong yêu cầu.
1.2. Tính Bất Biến và An Toàn của PUT
- Idempotent: Yêu cầu PUT là idempotent, có nghĩa là bạn có thể gửi nhiều lần và nó sẽ có hiệu ứng giống như chỉ gửi một lần. Chẳng hạn, nếu bạn cập nhật hồ sơ người dùng với cùng thông tin hai lần, kết quả trên máy chủ sẽ không thay đổi.
- An toàn: Yêu cầu PUT không được coi là an toàn, vì nó sửa đổi dữ liệu trên máy chủ và có thể gây ra tác dụng phụ.
1.3. Các Trường Hợp Sử Dụng cho PUT
- Tạo tài nguyên: Nếu tài nguyên không tồn tại, yêu cầu PUT có thể tạo mới nó.
- Thay thế toàn bộ tài nguyên: Nếu tài nguyên đã tồn tại, yêu cầu PUT sẽ thay thế nó bằng phiên bản được cung cấp trong yêu cầu.
1.4. Ví dụ về Yêu Cầu PUT
Giả sử bạn có một tài nguyên người dùng có cấu trúc sau:
{
"id": 1,
"name": "John Doe",
"email": "johndoe@example.com"
}
Để cập nhật toàn bộ tài nguyên người dùng, yêu cầu PUT sẽ như sau:
PUT /users/1 HTTP/1.1
Content-Type: application/json
{
"id": 1,
"name": "Jane Doe",
"email": "janedoe@example.com"
}
2. Yêu Cầu PATCH
2.1. Định Nghĩa của PATCH
Không giống như PUT, yêu cầu PATCH được sử dụng để áp dụng các thay đổi một phần cho một tài nguyên. Nó không thay thế toàn bộ tài nguyên mà chỉ định những thay đổi cần thiết cho các thuộc tính cụ thể.
2.2. Cập Nhật Một Phần với PATCH
Với PATCH, bạn chỉ cần sửa đổi các trường cụ thể mà bạn muốn cập nhật. Điều này rất hữu ích khi bạn muốn thay đổi một phần nhỏ của tài nguyên mà không cần sửa đổi toàn bộ.
2.3. Các Trường Hợp Sử Dụng cho PATCH
- Cập nhật các trường cụ thể: Chỉ sửa đổi các thuộc tính cụ thể của tài nguyên, giữ nguyên các thuộc tính khác.
- Cập nhật gia tăng: Áp dụng các thay đổi dần dần mà không cần thay thế toàn bộ tài nguyên.
2.4. Ví dụ về Yêu Cầu PATCH
Có nhiều định dạng khác nhau cho yêu cầu PATCH, nhưng trong bài viết này, chúng tôi sẽ tập trung vào JSON Patch theo định nghĩa trong RFC 6902.
Giả sử bạn muốn đổi tên người dùng thành “Jane Smith” và tăng tuổi của họ lên 1. Yêu cầu PATCH sẽ như sau:
PATCH /users/1 HTTP/1.1
Content-Type: application/json
[
{"op": "replace", "path": "/name", "value": "Jane Smith"},
{"op": "add", "path": "/age", "value": 1}
]
3. Khi Nào Sử Dụng PUT So với PATCH?
Việc lựa chọn giữa PUT và PATCH phụ thuộc vào kết quả mong muốn của yêu cầu.
3.1. Hướng Dẫn Chung
- Sử dụng PUT khi bạn muốn thay thế hoàn toàn tài nguyên bằng phiên bản mới.
- Sử dụng PATCH khi bạn chỉ muốn sửa đổi một phần cụ thể mà không thay thế toàn bộ.
3.2. Những Cân Nhắc
- Tính bất biến: Nếu thao tác yêu cầu tính bất biến (cùng một kết quả bất kể số lần thực hiện), PUT sẽ được ưu tiên hơn.
- Truyền dữ liệu: Nếu bạn đang gửi một lượng lớn dữ liệu, PATCH sẽ hiệu quả hơn do chỉ gửi các phần đã thay đổi.
- Thiết kế API: Cần xem xét thiết kế tổng thể của API và cách mà PUT và PATCH phù hợp với mô hình tài nguyên của bạn.
3.3. Ví dụ
-
Cập nhật hồ sơ người dùng:
- Nếu bạn muốn thay thế toàn bộ thông tin người dùng, hãy sử dụng PUT.
- Nếu bạn chỉ muốn thay đổi địa chỉ email của người dùng, hãy sử dụng PATCH.
-
Cập nhật sản phẩm:
- Nếu bạn muốn thay thế toàn bộ sản phẩm bằng phiên bản mới, hãy sử dụng PUT.
- Nếu bạn muốn thay đổi giá hoặc mô tả sản phẩm, hãy sử dụng PATCH.
4. Kết Luận
Nắm vững sự khác biệt giữa PUT và PATCH là điều cần thiết để phát triển các API RESTful hiệu quả. Bằng cách hiểu rõ ý nghĩa và ứng dụng của từng phương thức, bạn có thể cải thiện trải nghiệm người dùng và tối ưu hóa khả năng bảo trì cho ứng dụng của mình. Việc lựa chọn giữa PUT và PATCH có thể đơn giản, nhưng các chi tiết tinh tế có thể tạo ra sự khác biệt lớn trong hành vi của API. Hy vọng bài viết này đã giúp bạn có thêm kiến thức để tự tin quyết định phương pháp nào là phù hợp cho từng trường hợp sử dụng cụ thể của mình.
source: viblo