GraphQL開發整理

2021-10-12 01:45:44 字數 4484 閱讀 9049

graphql [官網](

graphql獲取資料

schema 和型別

schema(圖表模式)【核心概

念\color

核心概念

】客戶端響應資料問題

【後續補充apollo相關】

rest 的 api 配合json格式的資料交換,使得前後端分離、資料互動變得非常容易,而且也已經成為了目前web領域最受歡迎的軟體架構設計模式。

1、大量濫用,導致大量相似度很高(具有重複性)的api冗餘;

2、對於前端而言:rest api粒度較粗,難以一次性符合前端的資料要求,前端需要分多次請求介面資料。增加了前端人員的工作量。

3、對於後端而言:前端需要的資料往往在不同的地方具有相似性,但卻又不同,比如針對同樣的使用者資訊,有的地方只需要使用者簡要資訊(比如頭像、暱稱),有些地方需要詳細的資訊,這就需要開發不同的介面來滿足這些需求。當這樣的相似但又不同的地方多的時候,就需要開發更多的介面來滿足前端的需要。增加了後端開發人員的工作量和重複度。

當遇到當前端需求變化,涉及到改動舊需求時,有兩種手段:

【其實用到的資料大多都是來自於同乙個do或者dto,不過是在rest介面組裝資料時,用不同的vo來封裝不同字段,或者,使用同樣的vo,組裝資料時做刪減。】

那麼有沒有一種方案或者框架,可以使得在用到同乙個領域模型(do或者dto)的資料時,前端對於這個模型的資料字段需求的改動,後端可以根據前端的改動和需要,自動適配,自動組裝需要的字段,返回給前端呢?

針 對這

痛點,出

現了gr

aphq

l\color

針對這痛點,

出現了g

raph

qlgraphql

rest api

宣告式資料獲取,使得介面資料精確返回,資料查詢流程簡潔,照顧了客戶端的靈活性

介面靈活性差、介面操作流程繁瑣

乙個服務僅暴露乙個 graphql 層,消除了伺服器對資料格式的硬性規定,客戶端按需請求資料,可進行單獨維護和改進

客戶端拓展功能時要不斷編寫新介面(依賴於服務端)

傳輸層無關、資料庫技術無關使得 graphql 有更加靈活的技術棧選擇,能夠實現在網路協議層面優化應用

rest api 基於http協議,不能靈活選擇網路協議

1、首先要設計資料模型,用來描述資料物件,它的作用可以看做是vo,用於告知graphql如何來描述定義的資料,為下一步查詢返回做準備;

2、前端使用模式查詢語言(schema)來描述需要請求的資料物件型別和具體需要的字段(稱之為宣告式資料獲取);

3、後端graphql通過前端傳過來的請求,根據需要,自動組裝資料字段,返回給前端。

graphql對資料支援的操作有:

每乙個 graphql 服務都會定義一套型別,用以描述你可能從那個服務查詢到的資料。每當查詢到來,伺服器就會根據 schema 驗證並執行查詢。

想要描述資料,就必須離不開資料型別的定義。所以graphql設計了一套schema模式(可以理解為語法),其中最重要的就是資料型別的定義和支援。

------ 型別(

type

)\color

型別(typ

e)就是模式(schema)最核心的東西

那麼就分別來介紹下兩種型別。

標量型別(scalar type)

查詢

hero 

}

響應

}}

我們知道這些字段沒有任何次級字段 —— 因為讓它們是查詢的葉子節點。

graphql 自帶一組預設標量型別:

scalar date
然後就取決於我們的實現中如何定義將其序列化、反序列化和驗證。例如,你可以指定 date 型別應該總是被序列化成整型時間戳,而客戶端應該知道去要求任何 date 欄位都是這個格式。

物件型別(object type)

僅有標量型別是不能滿足複雜抽象資料模型的需要,這時候我們可以使用物件型別。

通過物件模型來構建graphql中關於乙個資料模型的形狀,同時還可以宣告各個模型之間的內在關聯(一對多、一對一或多對多)。

乙個 graphql schema 中的最基本的元件是物件型別,它就表示你可以從服務上獲取到什麼型別的物件,以及這個物件有什麼字段。使用 graphql schema language,我們可以這樣表示它:

type character
雖然這語言可讀性相當好,但我們還是一起看看其用語,以便我們可以有些共通的詞彙:

現在你知道乙個 graphql 物件型別看上去是怎樣,也知道如何閱讀基礎的 graphql 型別語言了。

列表和非空(lists and non-null)

那麼,型別系統僅僅只有型別定義是不夠的,我們還需要對型別進行更廣泛性的描述。

型別修飾符(type modifier)就是用來修飾型別,以達到額外的資料型別要求控制。

比如:

其他型別(介面,聯合,輸入)

除了上面的,graphql還有一些其他型別來更好的引入物件導向的設計思想:

介面型別(inte***ces):

其他物件型別實現介面必須包含介面所有的字段,並具有相同的型別修飾符,才算實現介面。

例如,你可以用乙個 character 介面用以表示《星球大戰》三部曲中的任何角色:

inte***ce

character

這意味著任何實現 character 的型別都要具有這些字段,並有對應引數和返回型別。

例如,這裡有一些可能實現了 character 的型別:

type human implements

character

type droid implements

character

聯合型別(union types):

聯合型別和介面十分相似,但是它並不指定型別之間的任何共同字段。幾個物件型別共用乙個聯合型別。

union searchresult = human | droid | starship
在我們的schema中,任何返回乙個 searchresult 型別的地方,都可能得到乙個 human、droid 或者 starship。注意,聯合型別的成員需要是具體物件型別;你不能使用介面或者其他聯合型別來創造乙個聯合型別。

這時候,如果你需要查詢乙個返回 searchresult 聯合型別的字段,那麼你得使用條件片段才能查詢任意字段。

請求

... on droid 

... on starship

}}

響應

,,]}}

_typename字段解析為 string,它允許你在客戶端區分不同的資料型別。

此外,在這種情況下,由於humandroid共享乙個公共介面(character),你可以在乙個地方查詢它們的公共字段,而不必在多個型別中重複相同的字段:

... on human 

... on droid

... on starship

}}

注意name仍然需要指定在starship上,否則它不會出現在結果中,因為starship並不是乙個character

輸入型別(input types):

更新資料時有用,與常規物件只有關鍵字修飾不一樣,常規物件時 type 修飾,輸入型別是 input 修飾。

比如定義了乙個輸入型別:

input reviewinput
你可以像這樣在變更(mutation)中使用輸入物件型別:

mutation createreviewforepisode

($ep: episode!

, $review: reviewinput!

)}

variables

}

響應

}}

資料約定:

格式

mesage

附帶的資訊

s ta

tus\color

status

值 -1,0,1,2,3,4,100大於0存在異常 其中100 代表graphql丟擲的異常狀態

c od

e\color

code

值string 在status ==100 下 code 有以下值

GraphQL 標量型別

標量 scalartypedefinition 是 graphql 中不可分割的原子資料型別,在服務中充當葉子節點。對於客戶端而言,合法的查詢集 select set 必須到達葉子節點,也就是到達標量型別節點。graphql 規範提供了五種標量 int 32 位有符號整型,超出精度範圍後,引擎會丟擲...

GraphQL學習筆記

三 使用express和graphql 搭建helloworld 四 引數型別與引數傳遞 graphql clients 六 使用mutations修改資料 七 認證與中介軟體 八 高階constructing types 提高可維護性,量上公升 graphql 是乙個用於 api 的查詢語言,是乙...

GraphQL 如何取代 Redux

簡評 使用 graphql 可以大大簡化客戶端狀態管理部分的 故事背景 在 2016 年,pathwright 的前端團隊就開始將客戶端的 從 backbone marionette 切換到 react。對於我們來說 ui 的宣告性模型比 mvc 模型更具意義。我們使用 flux 架構來管理隨著應用...