GraplQL是什麼?能幹啥?
一種查詢語言,一種是Facebook開發的API查詢語言。
GraphQL 這種方式能夠将原有 RESTful 風格時的多次請求聚合成一次請求,可以定制查詢結果(結構)。
和REST API的差別:
REST
- 1、傳回的資料格式和類型都是定義好的,如果想前後端保持預期效果,
- 1)協調後端改接口(工作量/頻繁改動);
- 2)前端自己做适配(會增加網絡傳輸量)。
- 2、某前端展現需要調用多個RESTful API才能擷取到足夠的資料時,必須要拉取的全部的資料之後,才能繪制界面。
GraphQL
- 所見即所得,查詢的傳回結果就是輸入的查詢結構的精确映射
- 查詢
{
user(uid:1) {
uid
name
}
}
- 結果
{
"data": {
"user": {
"uid": "1",
"name": "xxx"
}
}
}
- 減少網絡請求次數:GraphQL 将原有 RESTful 風格時的多次請求聚合成一次請求:
- 減少多次請求帶來的延遲
- 降低伺服器壓力,加快前端的渲染速度。
- 它的類型系統也非常豐富,除了标量、枚舉、清單和對象等類型之外,還支援接口和聯合類型等進階特性
- 提供調試工具 GraphiQL,并可以通過代碼生成文檔,節約文檔的維護成本和溝通成本
差別
- REST API中用戶端無法控制伺服器傳回的資料,存在網絡和記憶體資源的浪費。使用GraphQL開發人員可以聲明式地來表達其使用者界面的資料需求。他們聲明他們需要什麼資料,而不是如何擷取它。
- REST API多端點本質(每個端點代表一個資源),這要求用戶端進行多次往返以擷取資料。而GraphQL可以随時通過單次往返伺服器擷取視圖所需的所有初始資料。
使用GraphQL
基本概念
- Type(資料模型的抽象)
- Schemas(擷取資料的邏輯
- query(查詢)
- mutation(更改)
- subscription(訂閱)
- Resolve(解析函數)
schema {
query: Query //所有查詢請求
mutation: Mutation //所有改變伺服器資源的請求
}
GraphQL大體的解析流程就是遇到一個Query之後,嘗試使用它的Resolver取值,之後再對傳回值進行解析,這個過程是遞歸的,直到所解析Field的類型是Scalar Type(标量類型)為止。
go get github.com/graphql-go/graphql
- GraphQL的schema可以自動生成,具體操作可檢視graphq-cli文檔,步驟大緻包括npm包的安裝、graphql-cli工具的安裝,配置檔案的更改(此處需要指定服務對外暴露的位址) ,執行graphql get-schema 指令。
- (https://www.jianshu.com/p/e209f8a7a69d)
- https://github.com/graphql-cli/graphql-cli
- DataLoader
- 分頁
- test_case
query {
user(id: "1001"){
id,
name,
friends{
id,
name
}
}
}
query {
order(token:"Token a7c89cc30732b191cf6aa5ce43c99cscfsvfe9",
sn_startswith:"",
limit:3,
page:1)
{
id
sn
price
order_item{
id
item_sn
sku_name
}
}
}
自省查詢可能是你在GraphQL中唯一的GET請求。不管是query還是mutation,如果你要傳遞請求體,GraphQL請求方式都應該是POST
查詢__schema以列出所有該schema中定義的類型,并擷取每一個的細節
query {
__schema {
types {
name
kind
description
fields {
name
}
}
}
}
查詢__type以擷取任意類型的細節
query {
__type(name: "Repository") {
name
kind
description
fields {
name
}
}
}
參考資料:
官網入門:http://graphql.cn/learn/
https://docs.shenjian.io/use/graphql/graphql.html