Trong công nghệ xây dựng web-app hiện nay, có thể nói mô hình SCR (Client Side Rendering) đang được phát triển một cách vượt bật.

Cùng với sự ưa chuộng ấy, Rest API đóng vai trò rất quan trọng trong việc kết nối Back-endFront-end...

Hôm nay hãy cùng mình phân biệt hai khái niệm API gồm RestfulNon-Restful nha ^^

Khái niệm

RestAPI

Rest API là một ứng dụng được dùng để chuyển đổi cấu trúc của dữ liệu có những phương thức giúp kết nối với các thư viện và ứng dụng khác nhau.

Rest Api thường không được xem là công nghệ, mà nó là giải pháp giúp tạo ra những ứng dụng web services chuyên dụng để thay thế cho nhiều kiểu khác như: SOAP, WSDL,...

Restful API

Restful API là một trong những tiêu chuẩn được sử dụng để thiết kế API cho các ứng dụng web, để tiện hơn cho việc quản lý các resource.

Rest API thường chú trọng vào các tài nguyên của hệ thống bao gồm: ảnh, văn bản, âm thanh, video hoặc các dữ liệu di động,...

Nó thường bao gồm các trạng thái tài nguyên đã được định dạng sẵn và được truyền tải thông qua HTTP.

  • Một chức năng quan trọng nhất của REST là:
    • Quy định các cách sử dụng HTTP method chẳng hạn như: POST, GET, DELETE, PUT,... và cách có thể định dạng các URL cho ứng dụng web để có thể quản lý được các resource.
    • Restful không quy định logic code ứng dụng và không được giới hạn bởi những ngôn ngữ lập trình ứng dụng.
    • Bất kỳ framework hoặc ngôn ngữ nào cũng có thể được dùng để thiết kế được một Restful API.

API

API là từ viết tắt của cụm từ Application Programming Interface

Đây là tập hợp những quy tắc và cơ chế mà theo đó thì: Một ứng dụng hoặc một thành phần nào đó sẽ tương tác với một ứng dụng hoặc một số thành phần khác.

API có thể sẽ được trả về dữ liệu mà người dùng cần cho chính ứng dụng của bạn với những kiểu dữ liệu được dùng phổ biến như JSON hoặc XML.

REST

Rest là từ viết tắt của Representational State Transfer

Nó là một trong những dạng chuyển đổi cấu trúc, với kiểu kiến trúc thường được viết API. Rest thường sử dụng dụng phương thức HTTP đơn giản để có thể tạo ra giao tiếp giữa các máy.

Bởi vì thế, thay vì phải sử dụng một URL cho việc xử lý một số thông tin của người dùng thì Rest sẽ yêu cầu HTTP như: GET, POST, DELETE,... đến với bất kỳ một URL để được xử lý dữ liệu.

Ví dụ thực tế

Đặt thuộc tính hợp anh dev trẻ tuổi tên Đ đang làm một website xem video tương tự như YouTube chẳng hạn

Các thao tác cơ bản gồm:

  • Thêm, sửa, xóa video
  • like, share, comment video

Non-Restful

RestAPI thông thường được chia ra hai thao tác chính là: POSTGET

  • Trong đó:
    • GET: lấy một (getOne) hoặc tất cả (getAll) dữ liệu của resources
    • POST: đại diện cho thao tác CREATE, UPDATE, DELETE

Như ta có thể thấy với cấu trúc này hầu hết các thao tác đều được xây dựng bằng POST API và không hề có quy tắc nào.

Ta sẽ tiến hành xây dựng các API theo cấu trúc URL như sau:

Thao tácPhương thứcURLChú thích
Read OneGET/api/get-video/11 thể hiện id của video
/api/get-video?id=1
Read AllGET/api/get-all-videosvideos là số nhiều
CreatePOST/api/create-videodữ liệu của video sẽ được thêm ở body
UpdatePOST/api/update-video/11 thể hiện id của video
/api/delete-video?id=1
DeletePOST/api/delete-video?id=11 thể hiện id của video
/api/delete-video/1

Nhận xét

Như ta thấy các động từ mô tả nhiệm vụ của api có ngay sau /api/ như delete, create, update,...

Điểm chung dễ nhận biết nhất là các API này thiết kế theo tùy ý người xât dựng hoặc do yêu cầu khách hàng, doanh nghiệp mà không tuân theo một duy tắc nhất quán nào

Restful

Vẫn với bài toán trên ta sẽ xây dựng bằng Restful API như sau:

Thao tácPhương thứcURLThành côngThất bạiDư liệu trả về
Read OneGET/api/v1/videos/1200201-500video
Read AllGET/api/v1/videos200201-500videos
CreatePOST/api/v1/videos201202-500new video
UpdatePUT/PATCH/api/videos/1200201-500updated video
DeleteDELETE/api/v1/videos/1204201-500NULL

Bonus

Một số cách viết API theo quy tắc Restful thường được áp dụng để mô tả hành động cụ thể.

Giả sử Đ đang xây dựng một mạng xã hội. Với chức năng search, comment hay like thì sẽ viết api thế nào ?

  • Tìm kiếm: GET /api/search?q=key+word

  • Thích: POST /api/comments/1/like || /api/comments/1?action=like

  • Không thích: POST /api/comments/1/unlike || /api/comments/1?action=unlike

Những câu hỏi phỏng vấn

Phân biệt PUT và PATCH

  • PUT
    • Dùng để cập nhật cả đối tượng, thường sẽ truyền toàn bộ thuộc tính muốn cập nhật.
    • Những thuộc tính không được truyền sẽ được cập nhật là NULL...
  • PATCH
    • Dùng để cập nhật một vài thuộc tính trong một đối tượng.
    • Ta có thể truyền một vài thuộc tính muốn cập nhật mà không ảnh hưởng dữ liệu gốc

Ví dụ:

Ta có user như sau:

class User {
    String username;
    String password;
    String fullname;
    String email;
}

Và api để cập nhật user:

PUT /api/v1/users/1
PATCH /api/v1/users/1

PUT `/api/v1/users/1`
Content-Type: application/json
{
    "user": {
        fullname: "Trần Hữu Đang",
        email: "dangdepzai@frog.vn"
    }
}

User ban đầu có giá trị:

User {
    username: "frogdev", 
    password: "frog@123",
    fullname: "Frog Dev",
    email: "frogdev@frog.vn"    
}

Sau khi gọi API User sẽ có giá trị:

User {
    username: null, 
    password: null,
    fullname: "Trần Hữu Đang",
    email: "dangdepzai@frog.vn"  
}

Ta có thể thấy usernamepassword đã được cập nhật thành NULL.

Điều này xảy ra bởi vì PUT sẽ cập nhật toàn bộ đối tượng với data truyền vào, nếu thiếu thuộc tính nào, thuộc tính đó sẽ biến thành NULL.


Còn với PATCH. Giả sử dữ liệu được trả lại ban đầu và ta gọi PATCH.

PATCH `/api/v1/users/1`
Content-Type: application/json
{
    "user": {
        fullname: "Trần Hữu Đang",
        email: "dangdepzai@frog.vn"
    }
}

Sau khi gọi API User sẽ có giá trị:

User {
    username: "frogdev", 
    password: "frog@123",
    fullname: "Trần Hữu Đang",
    email: "dangdepzai@frog.vn"  
}

Dữ liệu được cập nhật chỉ khi nó có tồn tại trong phần body của request mà thôi !!!