學習 GraphQL 筆記(二)Query Schema

Search for a command to run...

No comments yet. Be the first to comment.
最近因為公司的需求,可能要導入 GraphQL 到專案裡面,所以去做了些研究開始學習 GraphQL。 過程中實在是有許多地方的概念,很難搞懂(老了學不來了QQ)。在此紀錄自己學習後的理解,希望會幫助到入門的人,也希望有大大提點不正確的地方(拜託鞭我,我抖 M 不抖音)。 這邊先簡介一下 GraphQL,GraphQL 是由 Facebook 開源出來的專案。其特點是所見即所得的存取資料方式。通常在 RESTful 的 API 設計下,一個頁面可能需要多個 API 才能得到全部要呈現的資料,但是...
現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...
現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...
從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...
囤積癖
607. Sales Person 題目敘述 SQL Schema > Create table If Not Exists SalesPerson (sales_id int, name varchar(255), salary int, commission_rate int, hire_date date) Create table If Not Exists Company (com_id int, name varchar(255), city varchar(255)...
上一篇學完了怎麼定義看得到的資料格是,這一篇就要來學習 Front End 要怎麼取得資料。下面是 Query Schema 的格式:

GraphQL 提供三個 operation type — query、mutation、subscription。operation type 省略不寫的話,預設會使用 query 來處理。如果一次有多個操作的話,則不能省略。但是建議不要省略,這樣在維護上比較易讀。Operation Name 沒有特別意義,只是幫助區分和維護。
// 不能省略
query {
search {
name
}
}
mutation {
create(text: "man") {
text
}
}
Schema 也跟 Object Type 一樣可以帶入參數,來搜尋特定的資料。也可以在參數傳入 Scalar,告訴 GraphQL 在回傳給前端時幫沒做型態的轉換。
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
從上面的 Argument,我們可以搜尋出特定條件下的參數。但是有時候我們需要找尋不只一個特定條件的資料,但是相同的名稱又會造成衝突,這時候就可以使用 Alias 來避免這個問題
{
son: cat(name: "popping") {
name
color
}
daughter: cat(name: "hino") {
name
color
}
}
上一篇在 Interface & Union 內有提到的 Inline Fragment 就是屬於這邊的範疇。Fragment 主要是用於當查詢的結構重複的時候,可以避免冗長的方法。不適用於 Input、Scalar 和 Enum。以上面為例:
fragment basic on Cat {
name
color
}
{
son: cat(name: "popping") {
...basic
}
daughter: cat(name: "hino") {
...basic
}
}
另外 Fragment 也是可以嵌 Fragment 的,上面的例子可以再改為下面的範例,輸出都是一樣的:
fragment min on Cat {
color
}
fragment basic on Cat {
name
...min
}
{
son: cat(name: "popping") {
...basic
}
daughter: cat(name: "hino") {
...basic
}
}
主要搭配 Interface & Union 來做使用,可以取出特定 Object Type 的資料,當 Type 和 Object Type 有匹配時,才會回傳資料
上面介紹的 Argument 是屬於靜態的傳入,值是固定的。但是大多數的使用情境還是動態的傳入資料,這時候就需要使用 Variables。變數需要在 Operation Name 先宣告,如果沒有使用的話就需求移除,不然會檢驗不過。
# 變數須以 $ 為前綴,Scalar 後面可設定預設值
query HeroNameAndFriends($episode: Episode = "JEDI") {
# 上方只是定義,這邊才是真的把變數傳入
hero(episode: $episode) {
name
friends {
name
}
}
}
在有些使用情境下,有時候會依靠變數去改變的不是搜尋特定的資料,而是要去改變查詢資料的結構。GraphQL 就有提供 Directives 來去使用,內建提供 @skip 和 @include 。
@include :當參數為 true 時包含此 Field
@skip :當參數為 true 時略過此 Field
# 需要定義使用的地方,且只能使用在定義的地方
# 不確定是否真的需要定義,有試過沒定義也能使用
directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
query myQuery($someTest: Boolean) {
experimentalField @skip(if: $someTest)
}
這邊要特別提到,其實 GraphQL 背後還是使用 HTTP 在傳輸請求的,所以 Server 需要可以支援 GET 和 POST。GraphQL 是把參數轉換成 JSON 的格式
{
**"operationName"**:"myQuery",
**"variables"**:{
},
**"query"**:"query myQuery($someTest: Boolean = true) {\n animal {\n name\n weight @skip(if: $someTest)\n height\n }\n}\n"
}
operationName:定義的 operation name
variables:上面介紹的變數,在這邊傳給 Server
query:GraphQL 的操作,用 JSON.stringify來字串化