REST API là gì?

API là gì?

API (Application Programming Interface), hay giao diện lập trình ứng dụng, là tập hợp các giao diện và quy tắc cho phép các phần mềm hoặc thành phần phần mềm tương tác với nhau. API đóng vai trò như một hợp đồng quy định cách bên sử dụng có thể yêu cầu chức năng, gửi dữ liệu và nhận kết quả từ bên cung cấp mà không cần biết chi tiết triển khai bên trong.

Việc sử dụng API giúp các thành phần phần mềm tái sử dụng chức năng có sẵn, giảm sự phụ thuộc vào cách triển khai nội bộ của nhau, đồng thời đơn giản hóa quá trình phát triển và bảo trì ứng dụng.

REST là gì?

REST (Representational State Transfer) là một phong cách kiến trúc được giới thiệu bởi Roy Fielding, dùng để thiết kế các hệ thống phân tán. REST đặc biệt phổ biến trong phát triển các dịch vụ web nhờ cách tổ chức tài nguyên và giao tiếp thông qua một giao diện nhất quán.

Trong môi trường web, các API được thiết kế theo REST thường sử dụng giao thức HTTP để trao đổi dữ liệu. Thay vì tạo một URL riêng cho từng hành động, cách tiếp cận này hướng đến việc tổ chức API xoay quanh các tài nguyên (Resource) và sử dụng các phương thức HTTP như GET, POST, PUT, PATCH và DELETE để tương tác với chúng.

REST không phải là một công nghệ, giao thức hay ngôn ngữ lập trình cụ thể, mà là một phong cách kiến trúc với những ràng buộc nhất định. Đây là một trong những cách tiếp cận để thiết kế Web API, bên cạnh các công nghệ và cách tiếp cận khác như SOAP.

REST API là gì?

REST API là API được thiết kế dựa trên phong cách kiến trúc REST, thường sử dụng HTTP để cho phép các ứng dụng giao tiếp với nhau. API được tổ chức xoay quanh các tài nguyên, được xác định thông qua URI và được thao tác bằng các phương thức HTTP phù hợp.

Ví dụ, trong một hệ thống quản lý sản phẩm, API có thể cung cấp các endpoint sau:

  • GET /api/products: lấy danh sách sản phẩm.
  • GET /api/products/10: lấy thông tin sản phẩm có ID là 10.
  • POST /api/products: tạo sản phẩm mới.
  • PUT /api/products/10: cập nhật toàn bộ thông tin sản phẩm có ID là 10.
  • PATCH /api/products/10: cập nhật một phần thông tin sản phẩm có ID là 10.
  • DELETE /api/products/10: xóa sản phẩm có ID là 10.

Trong các ví dụ trên, /api/products đại diện cho tập hợp tài nguyên sản phẩm, còn /api/products/10 xác định một sản phẩm cụ thể. Phương thức HTTP cho biết loại thao tác được thực hiện trên tài nguyên.

Trong thực tế, thuật ngữ REST API thường được sử dụng rộng rãi để chỉ các API web được thiết kế theo phong cách REST. Tuy nhiên, không phải API nào sử dụng HTTP và có cách đặt endpoint tương tự đều tuân thủ đầy đủ các ràng buộc của REST.

RESTful API là gì?

RESTful API là API được thiết kế để tuân thủ các ràng buộc của phong cách kiến trúc REST. Những ràng buộc này định hình cách các thành phần giao tiếp, quản lý trạng thái, sử dụng bộ nhớ đệm và tương tác thông qua một giao diện nhất quán.

REST có sáu nhóm ràng buộc chính:

  1. Client–Server: tách biệt trách nhiệm giữa phía client và phía server.
  2. Stateless: mỗi request phải chứa đủ thông tin cần thiết để server xử lý, không phụ thuộc vào ngữ cảnh được lưu từ các request trước đó trên server.
  3. Cacheable: dữ liệu phản hồi phải cho biết có thể được lưu vào bộ nhớ đệm hay không.
  4. Uniform Interface: các thành phần tương tác thông qua một giao diện nhất quán.
  5. Layered System: hệ thống có thể được tổ chức thành nhiều lớp, trong đó mỗi lớp chỉ cần biết lớp mà nó trực tiếp giao tiếp.
  6. Code-on-Demand (tùy chọn): server có thể gửi mã thực thi để client tải về và chạy khi cần.

Trong đó, Uniform Interface là một ràng buộc quan trọng, bao gồm việc xác định tài nguyên, thao tác thông qua các biểu diễn của tài nguyên, sử dụng thông điệp tự mô tả và điều hướng thông qua siêu liên kết (hypermedia).

Trong các ứng dụng web hiện nay, JSON thường được sử dụng để biểu diễn dữ liệu trao đổi giữa client và server. Tuy nhiên, việc sử dụng HTTP, JSON và cách đặt endpoint xoay quanh tài nguyên không tự động khiến một API trở thành RESTful. Mức độ tuân thủ còn phụ thuộc vào việc API có đáp ứng các ràng buộc kiến trúc REST hay không.

Trong thực tế, hai thuật ngữ REST API và RESTful API thường được dùng thay thế cho nhau. Tuy vậy, RESTful API đôi khi được dùng theo nghĩa chặt chẽ hơn để nhấn mạnh mức độ tuân thủ các ràng buộc của REST.

Resources (Tài nguyên)

Trong REST, Resource (tài nguyên) là đối tượng hoặc khái niệm mà hệ thống phía server cần định danh và cung cấp khả năng truy cập thông qua API. Tài nguyên có thể là một sản phẩm, người dùng, video, hình ảnh hoặc báo cáo thời tiết.

REST tổ chức API xoay quanh các tài nguyên thay vì chỉ tập trung vào những hành động mà hệ thống có thể thực hiện. Mỗi tài nguyên được định danh thông qua URI và có thể được biểu diễn dưới nhiều hình thức khác nhau khi trao đổi giữa client và server.

Các khái niệm quan trọng liên quan đến tài nguyên bao gồm:

  • Định danh tài nguyên (Resource Identification): URI được sử dụng để định danh một tài nguyên. Ví dụ, /api/products/10 có thể dùng để định danh sản phẩm có ID là 10.
  • Biểu diễn tài nguyên (Resource Representation): Dữ liệu được truyền giữa client và server để mô tả trạng thái của tài nguyên. Một tài nguyên có thể được biểu diễn dưới dạng JSON, XML hoặc các định dạng khác, tùy theo cách hệ thống hỗ trợ.
  • Metadata: Thông tin mô tả biểu diễn hoặc thông điệp trao đổi, chẳng hạn Content-Type cho biết định dạng nội dung của phản hồi.
  • Thông tin điều khiển và cache: Các HTTP header như Cache-Control và If-Modified-Since hỗ trợ việc kiểm soát bộ nhớ đệm và xác định liệu dữ liệu có cần được truyền lại hay không.

Ví dụ, với endpoint GET /api/products/10, server có thể trả về biểu diễn JSON của sản phẩm có ID là 10. Nếu hệ thống hỗ trợ nhiều định dạng, cùng tài nguyên đó có thể được biểu diễn theo những định dạng khác nhau.

Cần phân biệt tài nguyên với biểu diễn của tài nguyên: tài nguyên là đối tượng được định danh, còn biểu diễn là dữ liệu được truyền tải để mô tả tài nguyên đó.

Resource — tài nguyên

Server cung cấp endpoint GET /api/products/10 để truy cập sản phẩm có ID là 10.

URI — định danh tài nguyên

/api/products/10

Representation — biểu diễn tài nguyên

{"id":10,"name":"Keyboard","price":500000}

URI và URL là gì?

URL là gì?

URL (Uniform Resource Locator) là một loại URI dùng để định danh tài nguyên và cung cấp thông tin về vị trí cũng như cách truy cập tài nguyên đó.

URL thường được sử dụng để truy cập các trang web thông qua HTTP hoặc HTTPS. Ngoài ra, URL còn có thể sử dụng các scheme khác như mailto để tạo địa chỉ email hoặc ftp để truy cập tài nguyên thông qua giao thức truyền tệp.

Cấu trúc của URL

Ví dụ:

https://www.domainname.com/folder-name/web-page-file-name.htm

Có thể phân tích URL trên thành các thành phần sau:

  • Scheme: https cho biết scheme được sử dụng để truy cập tài nguyên. Trong trường hợp này, đó là HTTPS.
  • Host: www.domainname.com là hostname của máy chủ.
  • Path: /folder-name/web-page-file-name.htm là đường dẫn được sử dụng để xác định tài nguyên hoặc định tuyến yêu cầu đến tài nguyên tương ứng.

Trong các website truyền thống, path có thể tương ứng với thư mục và tệp trên máy chủ. Tuy nhiên, với các ứng dụng web hiện đại, path thường được xử lý thông qua cơ chế định tuyến và không nhất thiết tương ứng với một tệp vật lý.

Ví dụ về các URL có cấu trúc khác nhau:

  • Có nhiều phân đoạn trong path: https://sun-asterisk.vn/recruitment/ruby-engineer/
  • Path có phần mở rộng: https://vnexpress.net/covid-19-ngay-21-8-4344309.html
  • Path không có phần mở rộng: https://viblo.asia/posts/djeZ1jb55RlWz/edit

Những ví dụ trên cho thấy URL không bắt buộc phải có tên tệp hoặc phần mở rộng như .html hay .htm.

URI là gì?

URI (Uniform Resource Identifier) là một chuỗi ký tự dùng để định danh một tài nguyên. Tài nguyên đó có thể là một đối tượng vật lý hoặc logic, chẳng hạn một trang web, một cuốn sách, một người dùng hoặc một tài nguyên trong REST API.

URI là khái niệm tổng quát, bao gồm hai loại thường được nhắc đến là URL và URN:

  1. URL (Uniform Resource Locator): cung cấp thông tin về cách định vị hoặc truy cập tài nguyên.
  2. URN (Uniform Resource Name): định danh tài nguyên theo tên trong một không gian tên nhất định, thay vì tập trung vào vị trí truy cập.

Ví dụ về URN:

urn:isbn:9780132350884

URN này sử dụng mã ISBN để định danh một cuốn sách, thay vì chỉ ra địa chỉ máy chủ để truy cập sách đó.

Cấu trúc tổng quát của URI

Cú pháp tổng quát của một URI có thể được biểu diễn như sau:

scheme:[//authority]path[?query][#fragment]

Trong đó:

  • Scheme: cho biết loại định danh hoặc cơ chế được sử dụng. Ví dụ: https, mailto, urn.
  • Authority: thành phần tùy chọn, bắt đầu bằng //, thường chứa thông tin về host và có thể bao gồm thông tin khác như cổng.
  • Path: đường dẫn gồm các phân đoạn được phân tách bằng dấu /.
  • Query: thành phần tùy chọn, bắt đầu bằng ?, thường chứa các tham số bổ sung để xác định hoặc lọc dữ liệu.
  • Fragment: thành phần tùy chọn, bắt đầu bằng #, dùng để tham chiếu đến một phần hoặc vị trí cụ thể trong tài nguyên.

Không phải URI nào cũng chứa đầy đủ các thành phần trên. Cấu trúc thực tế phụ thuộc vào scheme được sử dụng.

Ví dụ:

  • https://example.com/api/products/10: URI sử dụng scheme HTTPS, thường được gọi là URL.
  • mailto:[email protected]: URI dùng để biểu diễn địa chỉ email.
  • tel:+1-816-555-1212: URI dùng để biểu diễn số điện thoại.
  • urn:isbn:9780132350884: URN dùng để định danh sách theo mã ISBN.

URI và URL khác nhau như thế nào?

URL là một loại URI. URI là khái niệm tổng quát hơn, tập trung vào việc định danh tài nguyên; URL cung cấp thêm thông tin về vị trí hoặc cách truy cập tài nguyên.

Vì vậy, mọi URL đều là URI, nhưng không phải mọi URI đều là URL.

Endpoint là gì?

Endpoint là điểm truy cập mà client sử dụng để giao tiếp với API. Trong Web API, endpoint thường được xác định bởi đường dẫn (path) kết hợp với phương thức HTTP tương ứng.

Ví dụ, ứng dụng gửi request đến URL:

https://abc.com/foo/bar

Trong đó, /foo/bar là phần path của URL và thường được gọi là endpoint path.

Cùng một path có thể hỗ trợ nhiều phương thức HTTP với chức năng khác nhau:

  • GET /foo/bar: lấy dữ liệu.
  • POST /foo/bar: gửi dữ liệu để tạo tài nguyên hoặc thực hiện thao tác theo thiết kế API.

Vì vậy, để hiểu một endpoint thực hiện chức năng gì, cần xem xét cả đường dẫn và phương thức HTTP tương ứng.

Ví dụ, GET /api/products?category=phone có thể được sử dụng để lấy danh sách sản phẩm thuộc danh mục phone. Trong đó, /api/products xác định tài nguyên cần truy cập, còn category=phone là query parameter cung cấp điều kiện lọc dữ liệu.

Nguyên tắc thiết kế đường dẫn

Khi thiết kế REST API, đường dẫn nên được tổ chức nhất quán và thể hiện rõ tài nguyên mà client muốn truy cập. Một số nguyên tắc phổ biến gồm:

1. Sử dụng danh từ để biểu diễn tài nguyên

Đường dẫn nên tập trung vào tài nguyên thay vì mô tả hành động. Ví dụ, sử dụng /api/products thay vì /api/getProducts để lấy danh sách sản phẩm. Hành động thường được thể hiện thông qua HTTP method như GET, POST, PUT hoặc DELETE.

2. Duy trì cấu trúc đường dẫn nhất quán

Các tài nguyên cùng loại nên tuân theo một quy ước đặt tên thống nhất. Ví dụ, sử dụng /api/products cho danh sách sản phẩm và /api/products/10 cho sản phẩm có ID là 10.

3. Sử dụng path để xác định tài nguyên cụ thể

Khi cần truy cập một tài nguyên cụ thể, có thể sử dụng định danh của tài nguyên trong đường dẫn.

Ví dụ: GET /api/products/10 dùng để lấy thông tin sản phẩm có ID là 10.

4. Sử dụng query parameters cho các điều kiện truy vấn

Query parameters thường được dùng để lọc, sắp xếp hoặc phân trang dữ liệu mà không cần tạo thêm đường dẫn cho từng điều kiện.

Ví dụ:

  • GET /api/products?category=phone: lọc sản phẩm theo danh mục.
  • GET /api/products?sortBy=price: sắp xếp sản phẩm theo giá, nếu API hỗ trợ.
  • GET /api/products?page=2&limit=10: lấy trang thứ hai với tối đa 10 sản phẩm, nếu API hỗ trợ.

Những nguyên tắc trên giúp đường dẫn dễ đọc, dễ sử dụng và thuận tiện hơn khi mở rộng API. Tuy nhiên, đây là các quy ước thiết kế phổ biến, không phải mọi API đều bắt buộc phải triển khai giống hệt nhau.

Kết luận

REST API là một cách thiết kế API dựa trên phong cách kiến trúc REST, trong đó các tài nguyên được định danh thông qua URI và được thao tác bằng các phương thức HTTP phù hợp.

Để hiểu cách một REST API hoạt động, cần nắm được các khái niệm nền tảng như API, REST, Resource, URI, URL và Endpoint, đồng thời hiểu cách tổ chức đường dẫn để xác định tài nguyên và truyền các điều kiện truy vấn.

Tuy nhiên, hiểu cấu trúc của REST API mới chỉ là bước đầu. Để sử dụng và thiết kế API hiệu quả, cần hiểu rõ vai trò của từng HTTP method, các mã trạng thái HTTP và cách client trao đổi dữ liệu với server.

Nguồn tham khảo

Bài viết khác

API Error Handling

API Error Handling là gì? API Error Handling (xử lý lỗi API) là quá trình phát hiện, quản lý và phản hồi các lỗi xảy ra trong quá trình API tiếp nhận request hoặc xử lý yêu cầu. Mục tiêu là giúp API phản hồi một cách nhất quán, cung cấp thông tin lỗi phù […]

API Validation – Kiểm tra tính hợp lệ của dữ liệu đầu vào API là gì ?

API Validation là gì? API Validation (kiểm tra tính hợp lệ của dữ liệu đầu vào API) là quá trình kiểm tra dữ liệu gửi đến API để xác định dữ liệu có đáp ứng các quy tắc đã đặt ra hay không, chẳng hạn như kiểu dữ liệu, độ dài, định dạng và các […]

JSON & HTTP Status Codes

JSON là gì? JSON (JavaScript Object Notation) là một định dạng dữ liệu dạng văn bản, có cấu trúc đơn giản và dễ đọc, thường được sử dụng để trao đổi dữ liệu giữa các chương trình. JSON tổ chức dữ liệu thông qua các cặp key-value, đối tượng (object) và mảng (array). Mặc dù […]

Go Channels & Go Context

1. Go Channels & Go Context là gì? Trong Go, goroutine cho phép chương trình chạy nhiều công việc đồng thời. Tuy nhiên, khi có nhiều goroutine cùng hoạt động, chúng cần một cách để trao đổi kết quả, phối hợp thời điểm thực thi và dừng công việc khi không còn cần thiết.  Đây […]

Goroutine & Concurrency

1. Concurrency là gì? Concurrency là khả năng tổ chức nhiều công việc để chúng có thể tiến triển xen kẽ hoặc đồng thời trong cùng một khoảng thời gian. Thay vì phải thực hiện tất cả công việc theo một trình tự duy nhất, chương trình có thể chuyển đổi giữa nhiều công việc […]

Go Fundamentals

1. Go là gì? Go (Golang) là ngôn ngữ lập trình go thường được sử dụng trong backend, REST API, hệ thống mạng, công cụ dòng lệnh, cloud infrastructure và các dịch vụ chạy đồng thời. Go là ngôn ngữ biên dịch và có hệ thống kiểu dữ liệu tĩnh (statically typed). Điều này có […]

Leave a Reply

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