日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

问道图语言_GraphQL_v1.0.0

發布時間:2024/1/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 问道图语言_GraphQL_v1.0.0 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版本號作者qq版本號
v1.0.0若布與宮合8416837graphql-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項目
  • 配置國內鏡像庫或私庫
repositories {maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }mavenCentral()}
啟動項目

默認端口8080

執行
  • 地址 http://localhost:8080/graphql

使用工具調試

  • 準備工具
# 克隆代碼 git clone https://github.com/prisma-labs/graphql-playground # 因為該項目使用yarn管理 npm install -g yarn --registry=https://registry.npm.taobao.org # 查看yarn的鏡像 yarn config get registry yarn config set registry https://registry.npm.taobao.org -g # 再次查看 yarn config get registry

# 注意 進入react包 一開始不小心在根目錄執行過yarn cd packages\graphql-playground-react # yarn安裝 經過一定時間的等待 yarn


安裝中:

# 啟動 yarn start

啟動報錯npm版本是 6.14.4報錯:Error [ERR_STREAM_WRITE_AFTER_END]: write after end

  • 改環境,使用Ubuntu安裝,npm版本6.7.0,yarn版本1.13.0,安裝成功:


    報錯:輸入地址,出現了跨域錯誤,Playground分屬不同內網ip,一個在宿主機,一個在虛擬機
Access to fetch at 'http://192.168.59.1:8080/graphql' from origin 'http://192.168.59.134:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

使用spring自帶的web

因為前端報錯,一時間沒有解決,所以使用springBoot啟動語法分析web
增加依賴:

implementation 'com.graphql-java-kickstart:graphiql-spring-boot-starter:5.0.4' implementation 'com.graphql-java-kickstart:graphql-spring-boot-starter:5.0.4'

啟動后,訪問:http://localhost:8080/graphiql
效果圖:

  • 請求執行,簡單過濾:

原理

在Java代碼(獲取)打斷點,然后執行graphiql,請求執行斷點:

參數傳了進來,lambda表達式根據參數過濾出了對應的數據
啟動初始化時,將數據關聯(book與author關聯):

初始化時,已經獲取了數據源的數據;可以改成實時初始化,因為一般的需求場景是一開始不知道數據呀。
新增兩個Query

執行,沒響應:

當然沒響應,因為沒有注冊這個接口:
注冊步驟(就是打代碼):
1)增加bookByName

return RuntimeWiring.newRuntimeWiring().type(newTypeWiring("Query").dataFetcher("bookByName", graphQLDataFetchers.getBookByNameDataFetcher())).type(newTypeWiring("Query").dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher())).type(newTypeWiring("Book").dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher())).build();
  • 增加獲取數據的邏輯
  • public DataFetcher getBookByNameDataFetcher() {return dataFetchingEnvironment -> {String name = dataFetchingEnvironment.getArgument("name");return books.stream().filter(book -> book.get("name").indexOf(name) >= 0).findFirst().orElse(null);};}

    但是,這樣寫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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。