Avatar
0
Vu Luong Anh Pundit
So sánh GraphQL và REST API
Cho em hỏi điểm mạnh và điểm yếu khi so sánh GraphQL và REST API, đặc biệt khi triển khai dự án thực tế ạ.
  • Answer
Remain: 5
1 Answer
Avatar
tvd12 Pundit
tvd12 Pundit
The Best Answer
Thật may là dự án ezyhttp cũng đang tích hợp GraphQL nên anh có thể trả lời em thế này nhé.

  1. Có vẻ như em đã sử dụng 1 thư viện client nào đó nên có sự nhầm lẫn ở đây, GraphQL là một ngôn ngữ truy vấn còn Rest là một giao thức được xây dựng trên http nên 2 thứ này bổ trợ cho nhau chứ không có sự so sánh nào ở đây cả
  2. Bản thân GraphQL có thể sử dụng với bất kì giao thức nào như tcp, websocket hay Rest (http), khi kết hợp với Rest thì nó có thể gọi thông qua GET và POST, ví dụ:

curl --location -g --request GET 'http://localhost:8083/graphql?operationName=me&query={me{id+name+friends{name}}}&variables={"id" : 1}'

Em có thể tham khảo ở trang chủ của GrahpQL để biết thêm chi tiết nhé

Nói rộng thêm 1 chút.

A. Khi kết hợp với Rest thì GraphQL cũng tiết kiệm được khá nhiều công sức. Ví dụ em có 1 đối tượng user thế này:

User { id, name, nickName}

Ví dụ Rest có 3 APIs:

  1. getUserId: chỉ trả về id
  2. getUsername: chỉ trả về name
  3. getUserNickName: chỉ trả về nickName

Thì với GraphQL em sẽ chỉ cần 1 API duy nhất với 3 truy vấn:

  1. curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{id}}&variables={"id" : 1}'
  2. curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{name}}&variables={"id" : 1}'
  3. curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{nickName}}&variables={"id" : 1}'

Rõ ràng là mọi thứ đơn giản hơn rất nhiều

B. GraphQL khi kết hợp với Rest sẽ chỉ nên có 1 API là /graphql thôi, và thay vì viết các lớp controller như ngày xưa thì giờ đây chúng ta sẽ viết các lớp DataFetcher

C. Nhìn chung kết hợp Rest với GraphQL cũng là một ý hay, nó giúp chúng ta tuỳ biến được số lượng trường cần response từ đó tiết kiệm được rất nhiều dung lượng.

Trong dự án hiện tại bọn anh đang làm thì chưa đả động gì đến GraphQL cả, một phần dự án bọn anh cũng lâu rồi, 1 phần là API của bọn anh khá phức tạp, gọi đến nhiều service khác nhau nên ứng dụng GraphQL cũng không có nhiều ý nghĩa.
  • 0
  • Reply
Thật sự phải signup tài khoản để dislike=)) Fact sai trùng trùng
  1. Rest không phải giao thức nó là standard thiết kế api qua http method.

2, Graphql chưa support giao thức nào khác http.

  1. Rest không thể kết hợp graphql vì nó chả liên quan gì đến nhau (1 cái là standard, 1 cái là query language).
  2. Không ai làm rest lại viết api getUserId, getUsername, getUserNickName. Vì rest là 1 quy chuẩn viết api nếu bạn viết api như này thì bạn chưa hiểu rest là gì. Tất nhiên tôi hiểu là bạn chỉ muốn lấy ví dụ nhưng mà ví dụ như này không có giá trị.
  3. "Không áp dụng Graphql vì logic phức tạp" đây là 1 câu nói vô nghĩa. Tôi đoán dự án bạn cũng dùng 3 data layers (controller - service - repositoty). Graphql khi được áp dụng vào dự án cũ sẽ đóng vài trò như 1 data fetching layer tương đương với tầng đầu tiên chứa các resolver (mình hay gọi thế tương đương với controller) và trỏ đến các service có sẵn của bạn nên logic của bạn ở service thế nào chả quan trọng.

Từ các ý trên thì mình thấy thứ nhất là fact về lý thuyết của bạn sai, thứ 2 là áp dụng thực tiện bạn chưa có nên mình dislike câu trả lời của bạn ^^

Nhân tiện mình muốn hỏi có cách nào xóa tài khoản không vì mình chỉ signup để comment đúng 1 cái thôi

 –  quanndh 1630793134000
Cám ơn bạn đã trả lời nhé, nhân tiện nếu bạn nghĩ bạn giỏi hãy ở lại để trả lời những câu hỏi khác nữa nhé, cám ơn bạn nhiều :D  –  tvd12 1630799417000
Mình đang hiểu là mục tiêu trả lời của bạn là để target đến cá nhân mình sai thay vì tập trung vào câu trả lời, vậy thì hãy cùng nhau phân tích nhé.

  1. Bạn có thể gọi REST là cái gì cũng được, theo wiki: https://en.wikipedia.org/wiki/Representational_state_transfer thì nó là một software architectural style chứ cũng không phải là "standard thiết kế api qua http method" như bạn nói, với mình thì mình gọi là giao thức (để client với server trao đổi thông tin với nhau) cho đơn giản
  2. Lại theo wiki: https://en.wikipedia.org/wiki/GraphQL, GraphQL is an open-source data query and manipulation language for APIs nghĩa là nó cung cấp dữ liệu cho APIs vậy thì nó có thể dùng với HTTP hay websocket hây bất kì tầng giao vận nào cũng được, hãy tham khảo spring để biết thêm chi tiết: https://github.com/spring-projects/spring-graphql/blob/main/spring-graphql/src/main/java/org/springframework/graphql/web/webflux/GraphQlWebSocketHandler.java
  3. Theo 1 và 2 thì GraphQL hoàn toàn có thể kết hợp với REST để cung cấp data cho API
  4. Nếu không viết thế thì phải viết thế nào? Hãy chỉ ra cách viết của bạn
  5. Dự án tôi đang làm liên quan đến blockchain, nó phức tạp hơn những gì bạn đang nghĩ đấy, nên không nên mang hệ quy chiếu của mình vào câu trả lời của người khác
  6. Dự án ezyhttp: https://github.com/youngmonkeys/ezyhttp/pull/13 của chúng tôi đang tích hợp để support GraphQL cũng gần giống với spring, nên hãy tham khảo trước khi phán xét nhé

Cuối cùng, hãy học cách trả lời, tập trung vào trả lời thay vì target vào cá nhân 1 người nào đó. Cám ơn bạn.

 –  tvd12 1630802676000