Share & grow the worlds knowledge!
We want to connect the people who have knowledge to the people who need it, to bring together people with different perspectives so they can understand each other better, and to empower everyone to share their knowledge.
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ế ạ.
Remain: 5
1 Answer
tvd12
Enlightened
tvd12
Enlightened
The Best Answer
ezyhttp
cũng đang tích hợp GraphQL nên anh có thể trả lời em thế này nhé.
- 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ả
- 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}'
để 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:
- getUserId: chỉ trả về id
- getUsername: chỉ trả về name
- 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:
- <code>curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{id}}&variables={"id" : 1}'</code>
- <code>curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{name}}&variables={"id" : 1}'</code>
- <code>curl --location -g --request GET 'http://localhost:8083/graphql?operationName=getUser&query={user{nickName}}&variables={"id" : 1}'</code>
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
- 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.
- 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).
- 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ị.
- "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é.
- Bạn có thể gọi REST là cái gì cũng được, theo wiki: https://en.wikipedia.org/wiki/Representational_state_transferthì 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
- 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
- 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
- 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
- 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
- Dự án ezyhttp: https://github.com/youngmonkeys/ezyhttp/pull/13củ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
- Question(s) 1.1K
- Answer(s) 2.2K
- Best answer(s) 136
- User(s) 548
-
Lâm Tấn Lộc added an answer <ul class="markdown-list"><li class="markdown-list-item"> Đầ... 1768014969000 -
-
Related Questions
Recent Activities
-
Voted up question. January 9, 2023 at 2:54 pm
-
Voted up question. January 9, 2023 at 2:54 pm
-
Voted up question. January 9, 2023 at 2:54 pm
-
Voted up question. January 9, 2023 at 2:54 pm
-
Voted up question. January 9, 2023 at 2:54 pm
Top Members
Trending Tags
.net
.net core
.net oop
#formatdate
abstract class
access app
access token
ai
android
ansible
anti-flooding
apache poi
api
app
architecture
artificial intelligence
assembly
async
asyncawait
atomicboolean
authentication
backend
backend nestjs
background
bash script
batch
bean
big project
binding
bitcoin
blockchain
blog
boot-nodes
branch
btree
bucket4j
buffered
build
bundle
c#
c# .net
cache
caching
callback
career
career path
cast
câu hỏi
centos
chat
cloud
cloud reliability
combobox
commit
communication
computer science
concurrent
config-css
connection pool
content-disposition
contract
controllerservice
convert date to number
cookie
cors
cosmos
cosmos-sdk
crawl data
cron
css
database
database migration
datasource
datastructure
datetime
deadlock
debug
decentralized exchange
deep learning
deploy contract
design patterns
design-pattern
dev
devops
dex
di
distraction programing
dns
đồ án tốt nghiệp
docker
download
draw.io
du học
dữ liệu lớn
duration
eclip
editor
elasticsearch
email
erc20
erc721
error
estimation
eth
ethereum
ethereum login
excel
excel-object-mapper
exception
exception handle
exception handler
executor
export compliance
extensions
exyfox
ezydata
ezyfox
ezyfox-boot
ezyfox-server
ezyfoxserver
ezyhttp
ezyjpa
ezymq-kafka
ezyplatform
ezyredis
facebook
fe
filter
floating point
flutter
format json
freetank
front-end
frontend
fullstack
fulltextsearch
future
gallery
game
game-box
game-room
game-server
gateway
get
get file zip
git
glide
go
golang
gorilla
graduation thesis
graphql
grapql
grpc
guide
h2 database
handy terminal
hazelcast
hibernate
hibernateconfig
html
http
https
hyperloglog
image
index
indexing
integration-test
intellij
interface
io
ioc
ipfs
isolate
issue
it
java
java core
java spring
java web
javacore
javascript
javaw
jenkins
jetbrains
job
join
jotform
jpa
jpql
jquery
js
json
json file
json to object
jsonproperty
jsp
jsp & servlet
junit-test
jvm
jwt
kafka
keep promise
kerberos
keycloak
kotlin
languague
laravel
library
list
load balancer
load-balancing
lock
log
log4j
log4j-core
login
lỗi font
lưu trữ
machine learning
macos
mail
mail template
main
map
maria db
markdown
math
maven
merge
mermaid
message queue
messaging
metamask
microservice
microservices
migration
mobile
model
mongo
monitoring
mq
msgpack
multi-threading
multiple tenant
multithread
multithreading
mysql
n
naming
naming convention
nan
netcore
netty
network
networking
nft
nft game
nginx
nio
node.js
nodejs
non-blocking io
null
odoo
oop
opensource
optimize
oracle
orm
otp message
paginaiton
pagination
pancakeswap
panic
partition
pdf
pgpool
phỏng vấn
php
plugin
pointer
postgresql
postman
pre
private_key
procedure
profile
programming
programming-language
project management
promise
properties
push message android
push notification
push-noti
python
python unicode
qr
qrcode
question
queue
rabbitmq
react-native
reactive
reactjs
reactjs download
readmoretextview
recyclerview
redis
refactor
refresh token
regex
replica
repository
request
resilence4j
resource
rest
restful
resttemplate
roadmap
room database
ropssten
ropsten
round robin
rust
rxjava
s3
schedule
scheduled
scheduled spring boot
search
security
send email
send mail
serialization
server
servlet
session
shift jis
singleton
sjis
slack
smart contract
soap
socket
socket server
soft delete
solution
sosanh
spring
spring aop
spring boot
spring data jpa
spring redis
spring security
spring websocket
spring websocket cors
spring-boot-test
spring-jpa
springboot
springsecurity
springwebflux mysql
sql
sql server
sse
ssl
ssl email
stackask
storage
stream
stream api
stress test
stresstest
structure trong spring boot
study
synchronize
synchronized
system environment variables
tcp
test
thiết kế tầng trong dự án
thread
thread pool
threadjava
threadpool
thymeleaf
tomcat
totp
tracking location
transaction
transfer
transfer git
udp
ui
uniswap
unit test
unity
upload
upload file
utf-8 file
validate
validate date
vector
video call
vietqr
view
volatile
vue
vue cli
vuejs
watermark
web
web3
web3 client
webassembly
webflux
webpack
webrtc
websocket
windows 11
winforms
wordpress
work
xss
zip file
zookeeper