Bài viết được sự cho phép của tác giả Duy Phan
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều được kích hoạt bởi các events.
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều và thường được kích hoạt bởi các events.
Khi kết hợp cùng nhau, chúng cho phép các application chia sẻ dữ liệu và function, giúp cho các services đạt được kết quả to lớn hơn tổng các thành phần của chúng.
API
và Webhook
đều cho phép các hệ thống phần mềm khác nhau đồng bộ và chia sẻ thông tin. Khi các ứng dụng phần mềm trở nên ngày càng kết nối, điều quan trọng là các nhà phát triển hiểu rõ sự khác biệt giữa hai phương tiện này để chia sẻ dữ liệu và lựa chọn công cụ phù hợp nhất với nhu cầu của công việc đang thực hiện.
API là gì?
API là viết tắt của cụm từ Application Programming Interface.
Một API giống như một cổng thông tin mà thông qua đó thông tin và chức năng có thể được chia sẻ giữa các services. Từ interface
là chìa khóa để hiểu rõ mục đích của một API. Giống như một trình duyệt web là một interface
cho người sử dụng cuối để nhận, gửi và cập nhật thông tin trên web server, một API là một interface
cung cấp chức năng tương tự cho các ứng dụng phần mềm.
Có nhiều loại và danh mục khác nhau của API (chúng ta sẽ khám phá sau), nhưng nói chung, API là cách phổ biến nhất để các hệ thống phần mềm khác nhau kết nối và chia sẻ thông tin.
Webhook là gì?
Một webhook
có thể được coi là một loại API được kích hoạt bởi các events
thay vì requests
.
Thay vì một service
tạo một request
để nhận một phản hồi từ service
khác, một webhook
là một dịch vụ cho phép một service gửi dữ liệu đến một service khác ngay sau khi một event
cụ thể được emit
. Webhooks đôi khi được coi là “API đảo ngược,” vì giao tiếp được khởi tạo bởi service gửi dữ liệu thay vì service nhận nó.
Với sự phát triển mạnh mẽ của các distributed system (hệ thống xử lý phân tán), webhook
đang trở nên phổ biến hơn khi là một giải pháp gọn nhẹ cho việc kích hoạt notification và cập nhật dữ liệu theo thời gian thực mà không cần phải phát triển một API toàn diện.
Chẳng hạn, nếu bạn muốn nhận notification trên Slack khi có tweet đề cập đến một tài khoản cụ thể và chứa một #hashtag
nhất định được publish, thay vì Slack liên tục yêu cầu Twitter về bài viết mới đáp ứng các tiêu chí này, việc Twitter gửi một thông báo đến Slack chỉ khi event
này xảy ra là một lựa chọn tốt hơn nhiều.
Đây chính là mục đích của một webhook
– thay vì phải liên tục yêu cầu dữ liệu, service nhận dữ liệu có thể ngồi lại và xử lý những gì nó cần mà không cần gửi các request
lặp đi lặp lại đến hệ thống khác.
API cho khả năng tích hợp mạnh mẽ
Một đặc điểm quan trọng của API
là chúng cung cấp giao tiếp hai chiều giữa các service khác nhau thông qua một chu kỳ request – response, thường sử dụng thông qua giao thức HTTP.
Trong một trường hợp sử dụng API điển hình, một service sẽ yêu cầu một tập hợp cụ thể dữ liệu từ một service khác bằng cách sử dụng yêu cầu HTTP GET
request. Miễn là yêu cầu hợp lệ, hệ thống nhận sẽ gửi về response bằng dữ liệu được yêu cầu ở định dạng có thể đọc bằng máy, thường là XML hoặc JSON. Điều này làm cho các service có thể chia sẻ dữ liệu mà không cần quan tâm đến ngôn ngữ lập trình cá nhân hoặc các đặc tả nội bộ của chúng.
Tính chất phổ quát của tương tác API có thể tạo ra vô số kịch bản, từ người dùng iPhone kiểm tra nhiệt độ địa phương thông qua API của AccuWeather
đến tài xế Grab
điều hướng đến vị trí đón tiếp theo thông qua API của Google Maps
.
Ngoài việc nhận dữ liệu, API cũng có thể xử lý toàn bộ các hoạt động “CRUD” (Create, Read, Update và Delete) giữa hai ứng dụng. Nói cách khác, API không chỉ để hiển thị dữ liệu cho người dùng trong một interface mà còn có thể được sử dụng để thay đổi dữ liệu trong service nơi nó được lưu trữ. Đây là cách mà API cho phép các hệ thống phần mềm mở rộng dịch vụ và chức năng của chúng, cũng như tích hợp với các nền tảng khác một cách toàn diện và có ý nghĩa.
Sự linh hoạt của API khiến chúng trở thành công cụ mạnh mẽ cho developers để mở rộng khả năng của ứng dụng.
Hầu hết các dịch vụ web hiện đại bao gồm API cho phép dữ liệu và chức năng của họ được tích hợp vào các công cụ khác – thực tế, rất hiếm khi gặp một dịch vụ web doanh nghiệp nào không tận dụng một API từ ít nhất một ứng dụng khác một cách nào đó.
Webhook cho phép chia sẻ dữ liệu một cách gọn nhẹ
Nhiều người có thể nghĩ rằng vì webhook
là reatime event
nên chúng khó triển khai từ mặt kỹ thuật.
Trên thực tế, một ưu điểm chính của webhook
là chúng dễ thiết lập hơn và tốn ít tài nguyên hơn so với API. Việc tạo một API là một quy trình phức tạp, trong một số trường hợp có thể khó khăn như việc thiết kế và xây dựng cấu trúc của service, nhưng triển khai một webhook
đôi khi chỉ đơn giản là thiết lập một HTTP POST
request duy nhất ở đầu gửi, thiết lập một URL ở đầu nhận để tiếp nhận và sau đó thực hiện một số hành động trên dữ liệu đó.
Các trường hợp sử dụng phổ biến cho webhook bao gồm:
- gửi danh sách email subscriptions và unsubscriptions đến một hệ thống CRM,
- tự động cập nhật phần mềm kế toán khi hóa đơn được thanh toán,
- hoặc thiết lập bất kỳ loại thông báo nào.
Trong mỗi loại event
này, data chỉ đi theo một hướng và không cần nhận hay xử lý dữ liệu được cập nhật.
Những đặc tính giống nhau khiến cho việc triển khai webhook tương đối dễ dàng cũng là lý do tại sao chúng giới hạn hơn nhiều so với APIs.
Việc cập nhật dữ liệu mà một webhook
gửi đòi hỏi việc cấu hình lại nó hoàn toàn để lắng nghe event
khác, và trong hầu hết các trường hợp, việc tạo một webhook mới sẽ hiệu quả hơn.
Khác với API
, webhook
không cho phép hệ thống gửi thêm, cập nhật và xóa dữ liệu ở đầu nhận, điều này là lý do tại sao webhook
một mình quá hạn chế để cung cấp việc tích hợp đầy đủ giữa các service
.
Tham khảo Web Developer Jobs HOT tại TopDev
Kiến trúc của API – hiện tại và tương lai
API có thể được phân loại dựa trên các giao thức và kiến trúc xác định cách chúng gửi – nhận dữ liệu.
Lịch sử cho thấy, mẫu kiến trúc phổ biến nhất cho thiết kế API là REST
(Representational State Transfer), đặc biệt là đối với các API phục vụ ứng dụng dựa trên nền tảng WEB.
REST
, được đặt ra bởi Roy Fielding vào năm 2000, cho phép giao tiếp giữa hai ứng dụng qua HTTP, tương tự như cách trình duyệt tương tác với máy chủ. REST
không phải là một tiêu chuẩn chính thức mà là một bộ hướng dẫn về cách thiết kế API và các web serivce khác. Một API được coi là RESTful
nếu thiết kế của nó tuân theo những đề xuất sau:
- Client-Server (Khách hàng-Máy chủ): Tương tự như browser yêu cầu một trang web từ server, trong một API RESTful, một ứng dụng (
client
) yêu cầu một URL được lưu trữ trên một service khác (server
) thông qua HTTP. Máy chủ đánh giá yêu cầu và response bằng dữ liệu được yêu cầu hoặc một thông báo lỗi. - Stateless (Không lưu trạng thái): Server không cần biết gì về state của client yêu cầu để cung cấp một response thích hợp. Một request từ
client
cần chứa đủ thông tin đểserver
gửi response. - Cacheability (Có thể lưu trữ vào bộ nhớ đệm): Response từ
server
nên chỉ ra liệuclient
có nên lưu trữ dữ liệu vào bộ nhớ đệm hay không. - Layered Systems (Hệ thống đa lớp): API không phụ thuộc vào một hệ thống cụ thể để thực hiện yêu cầu; nó có thể gửi phản hồi qua các lớp khác nhau. Điều này có nghĩa là hệ thống nhận có thể là một
client
, mộtproxy
, hoặc bất kỳ trung gian nào khác.
Ví dụ đơn giản sau đây https://www.boredapi.com/api/activity tuân theo quy ước REST. Khi bạn truy cập URL, browser của bạn sẽ hiển thị một activity được đề xuất để tham gia nếu bạn đang rảnh đến nhức cả trứng =)), được định dạng dưới kiểu JSON
:
{
"activity": "Shop at support your local farmers market",
"type": "relaxation",
"participants": 1,
"price": 0.2,
"link": "",
"key": "8979931",
"accessibility": 0.1
}
Một lựa chọn đáng chú ý khác là GraphQL, được phát triển bởi Facebook.
GraphQL cung cấp một cách linh hoạt và hiệu quả hơn cho khách hàng yêu cầu dữ liệu cụ thể mà họ cần, giảm việc lấy quá nhiều hoặc quá ít dữ liệu. Nó cho phép khách hàng xác định cấu trúc của phản hồi, tạo điều kiện cho tương tác linh hoạt và cá nhân hóa hơn.
mutation {
qrAssign(
connectorId: "23024"
poolName: "joint-tech"
qrId: "AMPJ-1120311132"
useCustom: true
) {
id
qrId
charger {
chargerUri
}
}
}
Trong tương lai, chúng ta có thể mong đợi sự tiếp tục phát triển trong kiến trúc API, với sự tập trung vào khả năng mở rộng, khả năng realtime và sự thích ứng với nhu cầu đa dạng của khách hàng.
Bài viết gốc được đăng tải tại duypt.dev
Xem thêm:
- Tổng quan về CQRS – Thiết kế hệ thống chịu tải lớn và dễ bảo trì
- Top 5 API thú vị dành cho các New Developers
- RESTful API là gì? Cách thiết kế RESTful API
Tin tuyển dụng IT mọi cấp độ trên TopDev đang chờ bạn ứng tuyển!