0%

Python Graphql 工具 - ariadne

前言

這篇文章主要來講解 Graphql 的優缺點以及說明現有的 Graphql 工具間的差異,並透過 Python 的套件 ariadne 來做進一步的範例說明。

正文

Graphql 的優缺點

優點

  1. 撈取特定的資料
  2. 減少請求的次數

缺點

  1. 只會回傳 200 OK

優點

撈取特定的資料

假如資料的階層相當的大,但實際要拿的資只是其中一小部分,那麼透過 Restful API,會浪費掉許多不必要的成本。

透過 Graphql 可以取得特定的內容,這也是 Graphql 蠻重要的一個優點!

假如資料的格式如下,若透過 Restful 的風格,今天要取得 User 的 name,則要先取得 me,再進一步下去拿 User,但偏偏這時只要 name,但實際拿到的內容是 User 整體的內容。

1
2
3
4
5
6
7
8
9
10
11
type Query {
me: User
}

type User {
id: ID
name: String
city: String
state: String
friends: [User]
}

但透過 Graphql,可以指定只取得特定的內容,寫法如下

1
2
3
4
5
{
me {
name
}
}

那麼,實際上拿到的回傳資料就相當簡潔

1
2
3
4
5
{
"me": {
"name": "John Doe"
}
}

減少請求的次數

在以往的 Restful 風格中,假如要取得特定使用者的朋友清單,可能會需要先取得使用者的 ID,再使用這個 ID 去取得朋友的清單,呼叫的 API 可能如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

[
{
"id": 1,
"name": "Percy"
},
{
"id": 2,
"name": "James"
}
]

/api/v1/friends?id=1
[
{
"id": 3,
"name": "Leo"
},
{
"id": 5,
"name": "Ru"
}
]

但透過 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 開發會比較。