GraphQLインターフェイスクエリ言語の初期学習

APIのクエリ言語

最近、会社でよく使われているのですが、興味のあることを学び、次のように記録しました。何かおかしいことがあれば、もっとアドバイスをいただければ幸いです。

I.概要

GraphQLは、apiのクエリ言語であり、プロジェクトの実行中に既存のデータをクエリする方法です。GraphQLは、API内のデータの完全で理解しやすい説明を提供し、クライアントが本当に必要なものを尋ねることを可能にし、APIを時間の経過とともに進化させやすくし、強力な開発ツールをサポートします。

APIJsonは同じレベルで比較できます。個人的には、APIJsonはJava開発でより実用的でシンプルだと感じています。たとえば、権限の検証では、@ MethodAccessアノテーションモデルを介してテーブル操作の権限に役割を追加し、リモート関数呼び出しをサポートできます。対照的に、graphqlの学習の難しさとコストそして、基準は比較的高いです。しかし、スキルが多すぎる場合は、今日見てみましょう。
(APIjsonの個人的な感覚はブログを参照できます、私はかなり気分がいいですhttps://blog.csdn.net/u014618954/article/details/107021638/)

2つの予備展示

Graphqlは、開発をある程度効率的かつ便利にするapiクエリ言語です。以下に例を示します。
たとえば、ログオンしてユーザーの名前を教えてくれるGraphQLサービスユーザーは次のようになります。①これらのタイプに定義済みのタイプとフィールドを
作成し
、各フィールドに各タイプの関数を提供します。

type Query {
  me: User
}
 
type User {
  id: ID
  name: String
}
function Query_me(request) {
  return request.auth.user;
}
 
function User_name(user) {
  return user.getName();
}

②クエリ

{
  me {
    name
  }
}

③戻る

{
  "me": {
    "name": "Luke Skywalker"
  }
}

上記はクエリクエリです。名前に応じて対応する名前のすべての名前をクエリできます。また、タイプや複数のパラメータなどでクエリを実行する利点は言うまでもありませんが、graphqlの公式ドキュメントを参照できます。簡単な説明は次のように3つのポイントに分かれています。

アプリケーションシナリオ
①複数のプラットフォームやその他の理由によるフィールドの冗長性
②1ページにデータを集約するための複数の呼び出し
③頻繁なインターフェイスの変更と簡素化されたロジック

3つの実用的なアプリケーション

ウェットについて長い間話した後、ドライグッズをいくつか手に入れましょう。今回は、Javaの基本的な使用法を示して行きます。

3.1 java + spring boot + graphql

サンプルアプリケーションは、特定の本の詳細情報を取得するための単純なAPIになります。

①ビルドディレクトリ

Select:
	Gradle Project
	Java
	Spring Boot 2.1.x
Project metadata
	Group: com.graphql-java.tutorial
	Artifact: book-details
Dependency
	web

②基本的な依存関係を追加する


com.graphql-java:graphql-java:11.0 // NEW
com.graphql-java:graphql-java-spring-boot-starter-webmvc:1.0 // NEW
com.google.guava:guava:26.0-jre // NEW
org.springframework.boot:spring-boot-starter-web
org.springframework.boot:spring-boot-starter-test
}

③関連ファイルを
作成するsrc / main / resourcesディレクトリにschema.graphqlsを作成します

//该部分是一个关于书籍的基本类型的定义,并与后续类型的查询有关
type Query {
  bookById(id: ID): Book 
}

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

type Author {
  id: ID
  firstName: String
  lastName: String
}

com.graphqljava.tutorial.bookdetailsディレクトリにGraphQLProvider.classを作成し、GraphQLインスタンスを作成します。

@Component
public class GraphQLProvider {

    private GraphQL graphQL;

    @Bean
    public GraphQL graphQL() { 
        return graphQL;
      //  这个GraphQL实例通过使用@Bean注释的GraphQL()方法公开为一个Spring Bean
    }

    @PostConstruct
    public void init() throws IOException {
   		 //使用Guava资源从类路径读取文件
        URL url = Resources.getResource("schema.graphqls");
        //GraphQL Java Spring适配器将使用该GraphQL实例使我们的模式通过HTTP在默认url / 
        String sdl = Resources.toString(url, Charsets.UTF_8);
        //创建一个GraphQLSchema和GraphQL实例
        GraphQLSchema graphQLSchema = buildSchema(sdl);
        this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
    }

    @Autowired
    GraphQLDataFetchers graphQLDataFetchers;

	//抓取数据
    private GraphQLSchema buildSchema(String sdl) {
        TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(sdl);
        RuntimeWiring runtimeWiring = buildWiring();
        SchemaGenerator schemaGenerator = new SchemaGenerator();
        return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
    }
    
	/*buildWiring使用graphQLDataFetchers bean实际注册两个DataFetchers:
	一个用于检索具有特定ID的图书
	一个用于获取特定书籍的作者*/
	
    private RuntimeWiring buildWiring() {
        return RuntimeWiring.newRuntimeWiring()
                .type(newTypeWiring("Query")
                        .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()))
                .type(newTypeWiring("Book")
                        .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()))
                .build();
    }
}

重要なインターフェース(独自に作成しないでください):
DataFetcherは単一のメソッドを持つインターフェースであり、DataFetcherEnvironmentタイプの単一のパラメーターのみを受け入れます
。GraphQLJavaがクエリを実行すると、クエリで検出された各フィールドに適切なものが呼び出されます。データテーブルデバイス。

public interface DataFetcher<T> {
    T get(DataFetchingEnvironment dataFetchingEnvironment) throws Exception;
}

pageCountの代わりにキーtotalPagesを持つ不一致のブックマッピングがあると仮定します。PropertyDataFetcherは正しい値を取得できないため、これにより、各ブックのpageCount値が空になります。この問題を解決するには、Book用の新しいDataFetcherを登録する必要があります(この場合は不要です)

 // 在 GraphQLDataFetchers class
    // 实现 DataFetcher
    public DataFetcher getPageCountDataFetcher() {
        return dataFetchingEnvironment -> {
            Map<String,String> book = dataFetchingEnvironment.getSource();
            return book.get("totalPages");
        };
    }

本と著者の例のリストを含む新しいクラスGraphQLDataFetchersを作成します

@Component
public class GraphQLDataFetchers {

    private static List<Map<String, String>> books = Arrays.asList(
            ImmutableMap.of("id", "book-1",
                    "name", "Harry Potter and the Philosopher's Stone",
                    "pageCount", "223",
                    "authorId", "author-1"),
            ImmutableMap.of("id", "book-2",
                    "name", "Moby Dick",
                    "pageCount", "635",
                    "authorId", "author-2"),
            ImmutableMap.of("id", "book-3",
                    "name", "Interview with the vampire",
                    "pageCount", "371",
                    "authorId", "author-3")
    );

    private static List<Map<String, String>> authors = Arrays.asList(
            ImmutableMap.of("id", "author-1",
                    "firstName", "Joanne",
                    "lastName", "Rowling"),
            ImmutableMap.of("id", "author-2",
                    "firstName", "Herman",
                    "lastName", "Melville"),
            ImmutableMap.of("id", "author-3",
                    "firstName", "Anne",
                    "lastName", "Rice")
    );

    public DataFetcher getBookByIdDataFetcher() {
        return dataFetchingEnvironment -> {
            String bookId = dataFetchingEnvironment.getArgument("id");
            return books
                    .stream()
                    .filter(book -> book.get("id").equals(bookId))
                    .findFirst()
                    .orElse(null);
        };
    }

    public DataFetcher getAuthorDataFetcher() {
        return dataFetchingEnvironment -> {
            Map<String,String> book = dataFetchingEnvironment.getSource();
            String authorId = book.get("authorId");
            return authors
                    .stream()
                    .filter(author -> author.get("id").equals(authorId))
                    .findFirst()
                    .orElse(null);
        };
    }
}

プロジェクトテストを開始するためのアプリケーションのメインメソッドを追加します

package com.graphqljava.tutorial.bookdetails;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BookDetailsApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookDetailsApplication.class, args);
    }

}

結果は、Webバージョンテストhttps://cpq-dev.ext.hp.com/playgroundを介して
ここに写真の説明を挿入
明確に取得できます
(プレイグラウンドは、postman、altairなどの対応するテストソフトウェアをインストールできます。この記事では、Webバージョンがあれば使用します。質問については、ソースコードを参照してください:https://github.com/graphql-java/tutorials)

3.2 Golang + graphql

①対応するサポートをインストールする

go get github.com/graphql-go/graphql

(このディレクトリはパスディレクトリの下にあります。前のブログのガイドパッケージに問題がありました。参照できます。プロジェクトのパスディレクトリがわからない場合は、go Current GOPATHコマンドを使用して見つけることができます)

②アプリケーション例
以下は、hello文字列タイプフィールドと文字列ワールドを返すResolveメソッドでパターンを定義する簡単な例です。このモードでGraphQLクエリを実行し、結果出力をJSON形式で出力します

package main

import (
	"encoding/json"
	"fmt"
	"log"

	"github.com/graphql-go/graphql"
)

func main() {
	// Schema
	fields := graphql.Fields{
		"hello": &graphql.Field{
			Type: graphql.String,
			Resolve: func(p graphql.ResolveParams) (interface{}, error) {
				return "world", nil
			},
		},
	}
	rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
	schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
	schema, err := graphql.NewSchema(schemaConfig)
	if err != nil {
		log.Fatalf("failed to create new schema, error: %v", err)
	}

	// Query
	query := `
		{
			hello
		}
	`
	params := graphql.Params{Schema: schema, RequestString: query}
	r := graphql.Do(params)
	if len(r.Errors) > 0 {
		log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
	}
	rJSON, _ := json.Marshal(r)
	fmt.Printf("%s \n", rJSON) // {"data":{"hello":"world"}}
}

上記は単純な例です。より興味深く複雑なケースの推奨事項については、
https
//github.com/graphql-go/graphql/tree/master/examples/https //github.com/graphql-go/graphql/blob/masterにアクセスしてください。 /graphql_test.go学ぶ

私はgraphqlの予備調査も行っていますが、大物がもっと多くの提案をしてくれることを願っています

この記事は、
https://graphql.org/公式ウェブサイトおよび関連するgitソースコードからの学習に言及しています

個人的な推奨事項https://blog.csdn.net/qq_41882147/article/details/82966783、非常に詳細で、紹介もより実用的で、高度な学習に適しています

おすすめ

転載: blog.csdn.net/MatChen/article/details/111516086