问道图语言_GraphQL_v1.0.0
| v1.0.0 | 若布與宮合 | 8416837 | graphql-java 14.0 |
文章目錄
- 介紹
- 用途
- 概念
- 實操
- Demo
- 依賴
- Java
- 進階
- 例子
- 準備
- 啟動項目
- 執行
- 使用工具調試
- 使用spring自帶的web
- 原理
- 語法
- 語法注意點
- Schema
- 靜態
介紹
查看本人的【Python Graphql】教程及源碼
查看Graphql入門教程_Nodejs版
用途
-
Get many resources in a single request
-
GraphQL 的部分吸引力在于,它可以幫助我們更好地處理那些昂貴的 HTTP/1 連接。這是因為 GraphQL 可以讓客戶端在一次請求回應中即可從獲取來自多個服務的響應數據(服務聚合)。將此與以超媒體為中心的 API 進行比較,后者通常需要大量的網絡請求(某些緩存可以提供幫助)
-
GraphQL 不僅為我們提供了減少往返請求或減少通過網絡傳輸的字節數的功能
-
GraphQL 的功能以及最大的折衷之處就是它以客戶為中心。在過去的幾年中,這在很多人的心中是一個令人擔憂的問題。丹尼爾·雅各布森(Daniel Jacobson)在5到7年前就其中一些問題寫了許多驚人的文章。這是另一篇文章。
-
我們的 REST API 雖然非常有能力以通用方式處理來自我們設備的請求,但并未針對其中的任何一個進行過優化
-
GraphQL 通過幫助我們構建能夠將客戶端用例編譯為服務器資源的服務器引擎,重新定義了客戶端服務器邊界。持久查詢使這更容易理解,本質上是客戶端生成的服務器資源
-
作為服務器端抽象的 GraphQL 在討論它在HTTP/2世界中是否仍然有意義時要牢記。盡管維護各種用例可能會導致典型的基于終結點的 API 出現問題,但GraphQL 使 API 提供程序可以專注于公開更多的可能性,而無需考慮現有客戶端的成本,也不必增加維護大量不同資源的復雜性。(它的確增加了成本:難以優化性能;并非總是可緩存的。這個經常需要在高度可定制的API中進行同樣的權衡取舍)
-
基于API的查詢語言
概念
查看概念
- TypeResolver提供了強大的功能,能夠根據獲取的數據轉換為對應的Schema中定義的字段類型
查看schema定義 - 在GraphQL服務器,通過Runtime Wiring使GraphQL Schema運行,得到一個可執行的GraphQL Schema
實操
Demo
依賴
我的項目是Maven管理,因此引入:
<dependency><groupId>com.graphql-java</groupId><artifactId>graphql-java</artifactId><version>14.0</version></dependency>Java
這個Demo可以跑起來,我加了注釋
import graphql.ExecutionResult; import graphql.GraphQL; import graphql.schema.GraphQLSchema; import graphql.schema.StaticDataFetcher; import graphql.schema.idl.RuntimeWiring; import graphql.schema.idl.SchemaGenerator; import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry;import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;/*** 功能:測試ql** @author: cc* @qq: 8416837* @date: 2020/5/8 16:59*/ public class HelloWorld {public static void main(String[] args) { // 定義數據結構String schema = "type Query{hello: String}";SchemaParser schemaParser = new SchemaParser();TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); //賦值RuntimeWiring runtimeWiring = newRuntimeWiring().type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("cc"))).build(); //轉成QL結構SchemaGenerator schemaGenerator = new SchemaGenerator();GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); // 執行查詢ExecutionResult executionResult = build.execute("{hello}");System.out.println(executionResult.getData().toString());} }進階
查看官方文檔
例子
準備
- 克隆代碼 git clone https://github.com/graphql-java/tutorials
這是個Gradle項目 - 配置國內鏡像庫或私庫
啟動項目
默認端口8080
執行
- 地址 http://localhost:8080/graphql
使用工具調試
- 準備工具
安裝中:
啟動報錯npm版本是 6.14.4報錯:Error [ERR_STREAM_WRITE_AFTER_END]: write after end
- 改環境,使用Ubuntu安裝,npm版本6.7.0,yarn版本1.13.0,安裝成功:
報錯:輸入地址,出現了跨域錯誤,Playground分屬不同內網ip,一個在宿主機,一個在虛擬機
使用spring自帶的web
因為前端報錯,一時間沒有解決,所以使用springBoot啟動語法分析web
增加依賴:
啟動后,訪問:http://localhost:8080/graphiql
效果圖:
- 請求執行,簡單過濾:
原理
在Java代碼(獲取)打斷點,然后執行graphiql,請求執行斷點:
參數傳了進來,lambda表達式根據參數過濾出了對應的數據
啟動初始化時,將數據關聯(book與author關聯):
初始化時,已經獲取了數據源的數據;可以改成實時初始化,因為一般的需求場景是一開始不知道數據呀。
新增兩個Query
執行,沒響應:
當然沒響應,因為沒有注冊這個接口:
注冊步驟(就是打代碼):
1)增加bookByName
但是,這樣寫Query代碼太冗余了,有沒有優雅的寫法呢?
以上截圖中的代碼模板一樣。如果這樣寫,那就太不優雅了。后來認識到,ql只是schema,與業務邏輯無關。
語法
語法注意點
Schema
靜態
type Records {userId: Stringusername: Stringname: StringgmtCreate: String } type GetData {records: [Records] }[Records]加上方括弧,表示這是個數組。
文章目錄
- 介紹
- 用途
- 概念
- 實操
- Demo
- 依賴
- Java
- 進階
- 例子
- 準備
- 啟動項目
- 執行
- 使用工具調試
- 使用spring自帶的web
- 原理
- 語法
- 語法注意點
- Schema
- 靜態
總結
以上是生活随笔為你收集整理的问道图语言_GraphQL_v1.0.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PDF怎么压缩大小,一分钟学会
- 下一篇: DAVINCI DM3730开发攻略——