前言
這篇文章主要來講解 Graphql 的優缺點以及說明現有的 Graphql 工具間的差異,並透過 Python 的套件 ariadne
來做進一步的範例說明。
正文
Graphql 的優缺點
優點
- 撈取特定的資料
- 減少請求的次數
缺點
- 只會回傳 200 OK
優點
撈取特定的資料
假如資料的階層相當的大,但實際要拿的資只是其中一小部分,那麼透過 Restful API,會浪費掉許多不必要的成本。
透過 Graphql 可以取得特定的內容,這也是 Graphql 蠻重要的一個優點!
假如資料的格式如下,若透過 Restful 的風格,今天要取得 User 的 name,則要先取得 me,再進一步下去拿 User,但偏偏這時只要 name,但實際拿到的內容是 User 整體的內容。
1 | type Query { |
但透過 Graphql,可以指定只取得特定的內容,寫法如下
1 | { |
那麼,實際上拿到的回傳資料就相當簡潔
1 | { |
減少請求的次數
在以往的 Restful 風格中,假如要取得特定使用者的朋友清單,可能會需要先取得使用者的 ID,再使用這個 ID 去取得朋友的清單,呼叫的 API 可能如下
1 |
|
但透過 Graphql,可以定義成這樣,並能夠一次撈到使用者的 name 以及該使用者的朋友名稱。
- Request
1
2
3
4
5
6
7
8{
me {
name
friends {
name
}
}
} - Response
1
2
3
4
5
6
7
8
9
10
11
12
13{
"me": {
"name": "John Doe"
"friends": [
{
"name": "Jane Doe"
},
{
"name": "Jim Doe"
}
]
}
}
缺點
只會回傳 200 OK
無論這個請求是否成功都會收到 HTTP 200 的 Status Code,而且在回傳的訊息上會多了 errors
的欄位,這欄位是用來說明錯誤的原因,這會導致在開發上要針對這欄位做額外的處理
內建沒有快取
Graphql 不像 Restful 本身支援快取機制,所以若是要有快取的功能,必須要與其他的工具做結合,或是使用 globally unique IDs
增加額外的複雜度
若是資料相對簡單且沒什麼變化,那麼使用 Restful 開發會比較好;但如果在資料變化快速的階段,使用 Graphql 開發會比較。