1. 程式人生 > >GraphQL(一):GraphQL介紹

GraphQL(一):GraphQL介紹

load alt 帶來 如何 開發 api文檔 學校 規範 ati

GraphQL(一):GraphQL介紹

GraphQL是什麽

GraphQL是facebook開源的一套數據交互方案,它並非某種具體的語言或者框架,它只是提供了一套解決方案,這套解決方案通過GraphQL規範進行定義,不同語言可以有自己的GraphQL實現,目前已經有很多語言完成了GraphQL的實現,可以在這裏查看。

怎麽使用GraphQL

GraphQL致力於提供一種直觀的彈性語法系統,用以描述客戶端程序設計時的數據需求以及數據交互行為。通俗地講就是允許客戶端在請求中精確的定義自己需要什麽,服務端根據客戶端的請求精確的返回相應的內容。比如有如下兩個相互關聯的實體:

Teacher{
    name: String
    phone: String
    age: Int
}

School{
    id: String
    name: String
    address: String
    teachers: List<Teacher>
}

使用GraphQL查詢指定學校的名稱是這樣的:

school(schoolId: "schoolId1"){
    name
}

返回:

data{
    "name" : "北京大學"
}

如果想要查詢學校的名稱以及所有老師的名字和電話:

school(schoolId: "schoolId1"){
    name
    teachers{
        name
        phone
    }
}

將得到:

data{
    "name" : "北京大學"
    "teachers" : [
        {
            "name" : "李老師",
            "phone" : "13312345678"
        },
        {
            "name" : "張老師",
            "phone" : "13312345673"
        },
        {
            "name" : "王老師",
            "phone" : "13312345672"
        }
    ]
}

以上只演示了GraphQL提供的查詢(query)功能,GraphQL還支持修改(mutation)和訂閱(subscription)。

要使得客戶端可以使用GraphQL的方式請求數據,首先需要在服務端提供GraphQL服務,這裏可以查看現有的實現了GraphQL的平臺,關於如何搭建GraphQL的服務,請查看GraphQL(二):GraphQL服務搭建

同時,GraphQL提供了強大的開發者工具GraphiQL,可以實時查看數據模型和API,為前後端開發者提供了一個便捷的溝通平臺。

為什麽要使用GraphQL

通過上面的內容,大致可以了解GraphQL給前後端數據交互帶來的變化。
使用RESTful風格的API,會從指定接口加載數據。每個接口都明確定義了返回的數據結構。這意味著客戶端需要的數據,已經在URL中制定好了。GraphQL中采用的方式截然不同,GraphQL的API通常只暴露一個接口,而不是返回固定數據結構的多個接口。 GraphQL返回的數據結構不是一成不變的,而是靈活的,讓客戶端來決定真正需要的是什麽數據。

這樣的變化能夠在一定程度上解決使用RESTful風格接口完成數據交互時會遇到的問題:

  1. 多端點,每個API都有自己的路徑需要管理
    技術分享圖片
  2. API數量龐大,新人自學習困難
    GraphQL通過圖的方式來組織模型,結合GraphiQL,新人能夠快速上手
  3. 後端數據模型難以規範
    RESTful接口多為頁面驅動,後端可能會設計很多差別不大的模型,目前並沒有一種強約束去要求後端開發人員規範模型,GraphQL要求在一開始就完成業務模型的分析和定義,避免後面業務模型的泛濫
  4. 在API設計時往往是面向頁面的,而頁面相比模型具有更差的穩定性
  5. API文檔維護工作量大
    RESTful的API需要管理大量文檔,但是依然存在文檔更新、文檔查閱方便的問題,雖然可以動用人力完善工具去解決,但是GraphQL天然就自帶文檔工具特性。我們在定義字段時,一並寫上description,通過GraphiQL可以實時查看:
type School {
    id: ID!
    # 學校id
    schoolId: String
    # 學校名稱
    schoolName: String
    # 學校年齡
    schoolAge: Int
    # 學校地址
    schoolAddress: String
    # 學校包含的老師
    teachers: [Teacher]
    # 校長
    master: String
}

GraphiQL中查看:
技術分享圖片

  1. 數據聚合較為麻煩
    這是在後端經常需要處理的問題,比如,客戶端需要一些數據,我們定義了一個RESTful的接口,但是這些數據分別在A和B服務中,最終我們會在後臺手動聚合A和B的數據到一個模型裏返回。而GraphQL通過不同的Resolver天然完成了數據聚合功能

GraphQL解除了接口和數據之間的綁定,對業務數據模型做了抽象和整理,以圖的方式來明確模型之間的關系,通過這些關系,具體業務場景可以定制自己的數據,不同的業務場景只要基於同樣一套基礎數據模型就可以復用過往的接口。

以上好處講起來有些抽象,需要多多實踐多多體會。

GraphQL(一):GraphQL介紹