Idempotency và Safety trong RESTful web services
idempotent
1
restful
10
webservice
4
White

Cẩm Huỳnh viết ngày 11/12/2015

Idempotency là gì?

Theo Wikipedia

Idempotence (/ˌaɪdɨmˈpoʊtəns/) is the property of certain operations in mathematics and computer science, that can be applied multiple times without changing the result beyond the initial application. The concept of idempotence arises in a number of places in abstract algebra (in particular, in the theory of projectors and closure operators) and functional programming (in which it is connected to the property of referential transparency).

Theo ngôn ngữ phi bác học

Trong toán học, một phép toán được xem là idempotent nếu như, cho dù được thực hiện bao nhiêu lần đi chăng nữa, nó đều cho ra kết quả giống nhau.

f(f(x)) = f(x)

Ví dụ như:

Phép toán nhân 0 là một phép toán idempotent.

f(x) = x * 0
=> f(f(10)) = f(10)
  • Phép toán trị tuyệt đối là một phép toán idempotent.
abs(abs(-10)) = abs(-10) = 10

Idempotent giúp ích được gì cho đời?

Khi thiết kế một RESTful web service, nếu có lúc bạn phân vân không biết nên dùng phương thức HTTP gì (GET, POST, PUT, DELETE, HEAD, vv) cho một request nào đó, nguyên tắc idempotence trong RESTful sẽ rất hữu ích.

Idempotency trong RESTful Design

Có hai khái niệm ta cần nhớ là idempotentsafe

  • Một request được xem là idempotent nếu sau vô số lần gọi, nó vẫn trả về kết quả như nhau. Ví dụ như: GET /books/day-con-lam-giau là một idempotent request.
  • Một request được xem là safe nếu sau vô số lần gọi, nó vẫn không làm thay đổi resource mà nó đang truy cập đến. Ví dụ như GET /books/day-con-lam-giausafe request, PUT /books/day-con-lam-giau không là safe request.

Bảng tham khảo tính safe và idempotent của một số phương thức HTTP hay dùng

--------- HTTP method ------------- -------------- Idempotent --------- --------- Safe -------------
HEAD YES YES
GET YES YES
POST NO NO
PUT YES NO
DELETE YES NO

Chú ý về phương thức DELETE

Về phương thức DELETE vẫn có một số tranh cãi về việc nó có idempotent hay không, tùy vào cách chúng ta hiện thực nó.

  1. Khi thực hiện một DELETE request, một số người sẽ không thực sự xóa resource mà chỉ đánh dấu nó là đã xóa, khi đó DELETE request của bạn là idempotent.
  2. Còn nếu ta xóa resource trong database thì trong lần thứ hai trở đi web service sẽ trả về `404 Not Found, nên ta cũng có thể tạm chấp nhận nó là idempotent.
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Cẩm Huỳnh

35 bài viết.
279 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
36 9
(Ảnh) Vì sao lại là Bật Đèn? Ai từng đọc qua Tắt Đèn hẳn đã biết tác phẩm được kết thúc bằng tình huống: Buông tay, chị vội choàng dậy, mở cửa...
Cẩm Huỳnh viết 9 tháng trước
36 9
White
32 25
Vừa rồi mình vừa tiết kiệm được $5 mỗi tháng sau khi migrate cái (Link) từ Digital Ocean sang Heroku Free Dyno. (Ảnh) Kết quả thật mĩ mãn vì hầu ...
Cẩm Huỳnh viết 7 tháng trước
32 25
White
31 4
(Ảnh) Bắt đầu một câu chuyện Vài ngày trước một người bạn nhờ tui xem giùm trang web của nó bị người dùng phàn nàn là hack tiền ảo. Tui mò vào ...
Cẩm Huỳnh viết 4 tháng trước
31 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
35 bài viết.
279 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!