原文地址:https://xeblog.cn/articles/6
簡介
千言萬語匯成一句話:我的未來式由我做主。
GraphQL是一個用於 API 的查詢語言,是一個使用基於型別系統來執行查詢的服務端執行時(型別系統由你的資料定義)。GraphQL並沒有和任何特定資料庫或者儲存引擎繫結,而是依靠你現有的程式碼和資料支撐。(完美的一段Copy)
為什麼要用它?
- 前端自己定義返回的資料及結構,降低前後端溝通成本
- 無需編寫介面文件(GraphQL會根據schema自動生成API文件)
- schema拼接,可以組合和連線多個GraphQL API,合併為一個,減少請求次數
運用
基於SpringBoot的運用
依賴
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>4.3.0</version>
</dependency>
<!-- 視覺化除錯工具 -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
複製程式碼
定義
服務入口定義
resources目錄下建立一個名為root.graphqls的檔案
# 查詢相關介面
type Query {
# 通過id獲取使用者資訊
getUserById(id: Int!): User
# 使用者資訊列表
listUser: [User]
}
# 變更相關介面
type Mutation {
# 新增使用者資訊
saveUser(user: addUserInput!): Boolean
# 刪除使用者資訊
deleteUser(id: Int!): Boolean
# 更新使用者資訊
updateUser(user: updateUserInput!): Boolean
}
複製程式碼
Query定義的是查詢相關的入口
Mutation定義的是增刪改相關的入口
剖析
geUserById: 與java類中的方法名一致
id: 方法引數,Int(I大寫) 表示是一個int型別,"!"表示非空
User: 返回值型別,這裡返回的是一個java物件
[type]: 表示是一個列表
複製程式碼
scheme定義
resources目錄下建立一個{beanName}.graphqls的檔案 這個檔案是 query/mutation 具體的 scheme 定義欄位、型別
示例:user.graphqls
# 使用者資訊物件
type User {
# 編號
id: Int!
# 使用者名稱
username: String!
# 密碼
password: String!
# 年齡
age: Int
}
# 新增使用者資訊輸入引數
input addUserInput {
id: Int!
username: String!
password: String!
age: Int
}
# 更新使用者資訊輸入引數
input updateUserInput {
id: Int!
username: String!
password: String!
age: Int
}
複製程式碼
實現入口
實體類
Query相關Java類實現
- 實現 GraphQLQueryResolver 介面
- 新增 @Component 註解
- 方法名、引數型別、返回值與root.graphqls內的定義一致
Mutation相關Java類實現
- 實現 GraphQLMutationResolver 介面
- 新增 @Component 註解
- 方法名、引數型別、返回值與root.graphqls內的定義一致
介面除錯
graphql預設請求路徑: /graphql
視覺化除錯介面:/graphiql
使用GraphiQL除錯
訪問地址:http://localhost:8080/graphiql
介面是長這個樣子的
Query
查詢單條資料
查詢所有資料
組合查詢
相同名稱的介面組合為一個介面呼叫,需要取一個別名用於區分它們
定義別名 類似這樣的格式
別名: 介面
複製程式碼