天天看點

認識GraphQL

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