今天小編給大家分享一下GraphQL類(lèi)型系統(tǒng)有哪幾種的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
興山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!
GraphQL 最初于 2012 年在 Facebook 開(kāi)發(fā),作為針對(duì)動(dòng)力不足的移動(dòng)設(shè)備的更好的數(shù)據(jù)獲取解決方案,GraphQL 于 2015 年開(kāi)源。作為一種為靈活性而設(shè)計(jì)的 API 技術(shù),GraphQL 是 API 的開(kāi)發(fā)人員和消費(fèi)者以及他們背后的組織的強(qiáng)大推動(dòng)者。GraphQL 實(shí)現(xiàn)的所有細(xì)節(jié)和功能都在 GraphQL Schema
中列出。為了編寫(xiě)一個(gè)有效的 GraphQL schema
,必須理解好 GraphQL 類(lèi)型系統(tǒng)。
GraphQL五種內(nèi)置標(biāo)量(scalar
)類(lèi)型、枚舉(enums
)、列表(list
)和非空包裝(non-null
)類(lèi)型、對(duì)象(object
)類(lèi)型以及與它們一起工作的抽象接口和聯(lián)合類(lèi)型(union
)。
GraphQL 模式中的所有數(shù)據(jù)最終都解析為各種標(biāo)量類(lèi)型,代表原始值。GraphQL 響應(yīng)可以看作一棵樹(shù),標(biāo)量類(lèi)型是樹(shù)末端的葉子。嵌套響應(yīng)中可以有多個(gè)級(jí)別,但最后一個(gè)級(jí)別將始終解析為標(biāo)量(或枚舉)類(lèi)型。 GraphQL 帶有五種內(nèi)置標(biāo)量類(lèi)型:Int
、Float
、String
、Boolean
和 ID
。
Int
是帶符號(hào)的 32
位非小數(shù)值,它是不包括小數(shù)的帶符號(hào)(正或負(fù))整數(shù)。帶符號(hào)的 32
位整數(shù)的最大值為 2,147,483,647
。這是用于數(shù)值數(shù)據(jù)的兩個(gè)內(nèi)置標(biāo)量之一。
Float
是帶符號(hào)的雙精度小數(shù)值。它是一個(gè)帶小數(shù)點(diǎn)的有符號(hào)(正或負(fù))數(shù),例如 1.2
,這是用于數(shù)值數(shù)據(jù)的另一個(gè)內(nèi)置標(biāo)量。
String
是 UTF-8
字符序列。 String
類(lèi)型用于任何文本數(shù)據(jù),這也可以包括非常大的數(shù)字等數(shù)據(jù)。大多數(shù)自定義標(biāo)量都是字符串?dāng)?shù)據(jù)類(lèi)型。
Boolean
包含 true
和 false
。
ID
是唯一標(biāo)識(shí)符,始終序列化為字符串,即使 ID
是數(shù)字也是如此。ID
類(lèi)型通??梢杂猛ㄓ梦ㄒ粯?biāo)識(shí)符 (UUID) 表示。
除了上述這些內(nèi)置標(biāo)量之外,還可以使用 scalar
關(guān)鍵字來(lái)定義自定義標(biāo)量??梢允褂米远x標(biāo)量來(lái)創(chuàng)建具有額外服務(wù)器級(jí)別驗(yàn)證的類(lèi)型,例如 Date
、Time
或 Url
。下面是一個(gè)定義新 Date
類(lèi)型的示例:
scalar Date
服務(wù)器將知道如何使用 GraphQLScalarType 處理與這種新類(lèi)型的交互。
Enum
類(lèi)型,也稱(chēng)為 Enumerator
類(lèi)型,用于描述了一組可能的值。
例如可以為游戲角色的 Job
和 Species
創(chuàng)建一個(gè)枚舉,其中包含系統(tǒng)將接受的所有值。
"角色的工作等級(jí)"
enum Job {
FIGHTER
WIZARD
}
"性格的種類(lèi)或血統(tǒng)"
enum Species {
HUMAN
ELF
DWARF
}
通過(guò)定義枚舉類(lèi)型可以保證角色的 Job
只能是 FIGHTER
或 WIZARD
,并且永遠(yuǎn)不會(huì)意外地成為其他一些隨機(jī)字符串,如果使用 String
類(lèi)型而不是 Enum
,那么就有可能是別的隨機(jī)字符串。
枚舉也可以用作參數(shù)中的可接受值。例如,可以制作一個(gè) Hand
枚舉來(lái)表示武器是單手(如短劍)還是雙手(如重斧),并使用它來(lái)確定是否可以裝備一個(gè)或兩個(gè):
enum Hand { SINGLE
DOUBLE}"戰(zhàn)士使用的一種武器"type Weapon {
name: String!
attack: Int
range: Int
hand: Hand
}
type Query {
weapons(hand: Hand = SINGLE): [Weapon]
}
Hand
枚舉已聲明為 SINGLE
和 DOUBLE
作為值,weapons
字段上的參數(shù)具有默認(rèn)值 SINGLE
,這意味著如果未傳遞任何參數(shù),它將回默認(rèn)為 SINGLE
。
可能會(huì)注意到內(nèi)置標(biāo)量列表中缺少 null
或 undefined
(一種被許多語(yǔ)言視為原始類(lèi)型的常見(jiàn)類(lèi)型)。 Null
在 GraphQL 中確實(shí)存在,表示缺少一個(gè)值。默認(rèn)情況下,GraphQL 中的所有類(lèi)型都可以為 null
,因此 null
是對(duì)任何類(lèi)型的有效響應(yīng)。為了使值成為必需值,必須將其轉(zhuǎn)換為帶有尾隨感嘆號(hào)的 GraphQL 非空類(lèi)型。 Non-Null
被定義為類(lèi)型修飾符,這些類(lèi)型用于修飾它所引用的類(lèi)型。例如,String
是一個(gè)可選的(或可為空的)字符串,而 String!
是必需的(或非空的)字符串。
GraphQL 中的 List
類(lèi)型是另一種類(lèi)型修飾符。任何用方括號(hào) ([]
) 括起來(lái)的類(lèi)型都會(huì)成為 List
類(lèi)型,這是一個(gè)定義列表中每個(gè)項(xiàng)目類(lèi)型的集合,像 JavaScript 中的數(shù)組。
例如,定義為 [Int]
的類(lèi)型意味著這個(gè)集合所有元素的類(lèi)型為 Int
類(lèi)型,[String]
將是 String
類(lèi)型的集合。 Non-Null
和 List
可以一起使用,使一個(gè)類(lèi)型既需要又定義為 List
,例如 [String]!
。
如果 GraphQL 標(biāo)量類(lèi)型描述分層 GraphQL 響應(yīng)末尾的“葉子”,那么對(duì)象類(lèi)型描述中間的 分支
,并且 GraphQL 模式中的幾乎所有內(nèi)容都是一種對(duì)象類(lèi)型。
對(duì)象由命名字段(鍵)列表和每個(gè)字段將解析為的值類(lèi)型組成。對(duì)象是用 type
關(guān)鍵字定義的。至少要定義一個(gè)或多個(gè)字段,字段不能以?xún)蓚€(gè)下劃線(__
)開(kāi)頭,以免與GraphQL自省系統(tǒng)沖突。
例如創(chuàng)建一個(gè) Fighter
對(duì)象來(lái)表示游戲中的一種角色:
"具有直接戰(zhàn)斗能力和力量的英雄"
type Fighter {
id: ID!
name: String!
level: Int
active: Boolean!
}
在此示例中,聲明了 Fighter
對(duì)象類(lèi)型,定義了 4 個(gè)字段:
id
:非空 ID
類(lèi)型。
name
:非空字符串類(lèi)型。
level
:Int
類(lèi)型。
active
:非空布爾類(lèi)型。
在聲明上方,可以使用雙引號(hào)添加注釋?zhuān)绫纠?code>具有直接戰(zhàn)斗能力和力量的英雄,這將顯示為類(lèi)型的描述。
在此示例中,每個(gè)字段都解析為標(biāo)量類(lèi)型,但對(duì)象字段也可以解析為其他對(duì)象類(lèi)型。例如,可以創(chuàng)建一個(gè) Weapon
類(lèi)型,并且可以設(shè)置 GraphQL 模式,其中 Fighter
上的 weapon
字段將解析為一個(gè) Weapon
對(duì)象:
"戰(zhàn)士使用的一種武器"
type Weapon {
name: String!
attack: Int
range: Int
}
"具有直接戰(zhàn)斗能力和力量的英雄"
type Fighter {
id: ID!
name: String!
level: Int
active: Boolean!
weapon: Weapon
}
對(duì)象也可以嵌套到其他對(duì)象的字段中。
有三種特殊對(duì)象作為 GraphQL schema
的入口點(diǎn):Query
、Mutation
和 Subcription
。這些被稱(chēng)為根操作類(lèi)型,并遵循與任何其他對(duì)象類(lèi)型相同的規(guī)則。
schema
關(guān)鍵字表示 GraphQL 模式的入口點(diǎn)。根 Query
、Mutation
和 Subcription
類(lèi)型將位于根模式對(duì)象上:
schema {
query: Query
mutation: Mutation
subscription: Subscription
}
Query 類(lèi)型在任何 GraphQL 模式上都是必需的,代表一個(gè)讀取請(qǐng)求,類(lèi)似于 REST API GET
。以下是返回 Fighter
類(lèi)型列表的根查詢(xún)對(duì)象的示例:
type Query {
fighters: [Fighter]
}
Mutations
代表寫(xiě)入請(qǐng)求,類(lèi)似于 REST API
中的 POST
、PUT
或 DELETE
。在以下示例中,Mutation
有一個(gè)帶有命名參數(shù)(輸入)的 addFighter
字段:
type Mutation {
addFighter(input: FighterInput): Fighter
}
最后,一個(gè) Subscription
對(duì)應(yīng)于一個(gè)事件流,它將與 Web 應(yīng)用程序中的 Websocket 結(jié)合使用。如下所示:
type Subscription {
randomBattle(enemy: Enemy): BattleResult
}
請(qǐng)注意,schema
入口點(diǎn)通常在某些 GraphQL 實(shí)現(xiàn)中被抽象掉。
GraphQL 對(duì)象的字段本質(zhì)上是返回值的函數(shù),并且它們可以像任何函數(shù)一樣接受參數(shù)。字段參數(shù)由參數(shù)名稱(chēng)后跟類(lèi)型定義,參數(shù)可以是任何非對(duì)象類(lèi)型。在此示例中,可以通過(guò) id
字段(解析為非空 ID
類(lèi)型)過(guò)濾 Fighter
對(duì)象:
type Query {
fighter(id: ID!): Fighter
}
這個(gè)特定示例對(duì)于從數(shù)據(jù)存儲(chǔ)中獲取單個(gè)項(xiàng)目很有用,但參數(shù)也可用于過(guò)濾、分頁(yè)和其他更具體的查詢(xún)。
與 Object
類(lèi)型一樣,抽象接口類(lèi)型由一系列命名字段及其關(guān)聯(lián)的值類(lèi)型組成。接口看起來(lái)像并遵循與對(duì)象相同的所有規(guī)則,但用于定義對(duì)象實(shí)現(xiàn)的子集。
到目前為止,在 schema
中有一個(gè) Fighter
對(duì)象,但可能還想創(chuàng)建一個(gè)Wizard
、一個(gè) Healer
和其他對(duì)象,它們將共享大部分相同的字段但還是存在一些差異。在這種情況下,可以使用接口來(lái)定義它們共有的字段,并創(chuàng)建作為接口實(shí)現(xiàn)的對(duì)象。
在下面的示例中,使用 interface
關(guān)鍵字創(chuàng)建 BaseCharacter
接口,其中包含每種類(lèi)型的字符將擁有的所有字段:
"A hero on a quest."interface BaseCharacter {
id: ID!
name: String!
level: Int!
species: Species
job: Job
}
每個(gè)角色類(lèi)型都有字段 id
、name
、level
、species
和 job
。
現(xiàn)在,假設(shè)有一個(gè)具有這些共享字段的 Fighter
類(lèi)型和一個(gè) Wizard
類(lèi)型,但是 Fighters
使用 Weapon
而 Wizards
使用 Spells
??梢允褂?implements
關(guān)鍵字將每個(gè)描述為 BaseCharacter
實(shí)現(xiàn),這意味著它們必須具有創(chuàng)建的接口中的所有字段:
type Fighter implements BaseCharacter {
id: ID!
name: String!
level: Int!
species: Species
job: Job!
weapon: Weapon
}
type Wizard implements BaseCharacter {
id: ID!
name: String!
level: Int!
species: Species
job: Job!
spells: [Spell]
}
Fighter
和 Wizard
都是 BaseCharacter
接口的有效實(shí)現(xiàn),因?yàn)樗鼈兙哂兴璧淖侄巫蛹?/p>
可以與對(duì)象一起使用的另一種抽象類(lèi)型是 union
類(lèi)型。使用 union
關(guān)鍵字,可以定義一個(gè)類(lèi)型,其中包含所有有效響應(yīng)的對(duì)象列表。
使用上面創(chuàng)建的接口,可以創(chuàng)建一個(gè) Character union,將 character
定義為 Wizard
或 Fighter
:
union Character = Wizard | Fighter
等號(hào) =
設(shè)置定義,管道符 |
用作 OR
語(yǔ)句。請(qǐng)注意,union
必須由對(duì)象或接口組成,標(biāo)量類(lèi)型在 union
上無(wú)效?,F(xiàn)在,如果查詢(xún) characters
列表,它可以使用 Character
union
并返回所有 Wizard
和 Fighter
類(lèi)型。
以上就是“GraphQL類(lèi)型系統(tǒng)有哪幾種”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。