Начало работы с GraphQL в Java


Начало работы с GraphQl:Java

1. Добавьте зависимость maven


<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java</artifactId>
    <version>16.2</version>
</dependency>
Войдите в полноэкранный режим Выйти из полноэкранного режима

2. Создание GraphQL ObjectType и DataFetchers

  1. Определите GraphQLObjectType для пользователя, для этого я создаю класс, который поможет создавать различные типы и будет использоваться SchemaBuilderHelper.
import graphql.Scalars;
import graphql.schema.GraphQLObjectType;
import org.springframework.stereotype.Component;

@Component
public class MyGraphQLObjectTypes {

    public GraphQLObjectType getUserType() {
        return new GraphQLObjectType.Builder()
                .name("User")
                .field(builder ->
                        builder
                                .name("name")
                                .type(Scalars.GraphQLString)
                )
                .field(builder ->
                        builder
                                .name("email")
                                .type(Scalars.GraphQLString)
                ).build();
    }
    // define your own data type for your Model classes 
}
Вход в полноэкранный режим Выход из полноэкранного режима

Метод getUserType вернет GraphQLObjectType, который эквивалентен приведенному ниже классу user

import lombok.Data;

@Data
public class User {
    private String name;
    private String email;
}
Вход в полноэкранный режим Выход из полноэкранного режима
  1. Теперь мы создадим в корневом запросе поле пользователя типа User, которое мы только что создали в предыдущем шаге

import graphql.Scalars;
import graphql.schema.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@RequiredArgsConstructor
@Component
public class SchemaBuilderHelper {
    private final MyGraphQLObjectTypes myGraphQLObjectTypes;

    public void buildQuery(GraphQLObjectType.Builder queryBuilder, GraphQLCodeRegistry.Builder codeRegistry) {
        queryBuilder.name("Query");

        buildUserQuery(queryBuilder, codeRegistry);

    }

    private void buildUserQuery(GraphQLObjectType.Builder queryBuilder, GraphQLCodeRegistry.Builder codeRegistry) {

        GraphQLObjectType userType = myGraphQLObjectTypes.getUserType();

        codeRegistry.dataFetcher(FieldCoordinates.coordinates("Query", "user"), (DataFetcher<HashMap<String, Object>>) dataFetchingEnvironment -> {
            HashMap<String, Object> res = new HashMap<>();
            res.put("name", "Ram");
            res.put("email", "Ram@gmail.com");
            return res;
        });

        queryBuilder.field(builder -> builder
                .name("user")
                .type(userType));
    }


}
Войти в полноэкранный режим Выйти из полноэкранного режима

Пока что я создал статический dataFetcher для пользователя (тип User), но его можно заменить динамическим источником данных.

3. Создайте еще один класс GraphQLConfig

Этот класс будет использовать SchemaBuilderHelper для построения GraphQLSchema и создания spring bean для нее, а также для
GraphQL, который используется для выполнения запросов graphQL.

import com.example.graphqljava.graphql.SchemaBuilderHelper;
import graphql.GraphQL;
import graphql.schema.GraphQLCodeRegistry;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaPrinter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GraphQLConfig {

    @Bean
    public SchemaPrinter getSchemaPrinter() {
        return new SchemaPrinter();
    }

    @Bean
    public GraphQLSchema getGraphQLSchema(SchemaBuilderHelper schemaBuilderHelper) {
        GraphQLCodeRegistry.Builder codeRegistry = GraphQLCodeRegistry.newCodeRegistry();
        GraphQLObjectType.Builder queryBuilder = GraphQLObjectType.newObject();
        //build query type
        schemaBuilderHelper.buildQuery(queryBuilder, codeRegistry);

        return GraphQLSchema.newSchema()
                .query(queryBuilder.build())
                .codeRegistry(codeRegistry.build())
                .build();
    }

    @Bean
    public GraphQL getGraphQl(GraphQLSchema graphQLSchema) {
        return GraphQL.newGraphQL(graphQLSchema).build();
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

4. Создайте модель класса GraphQLRequest

Он будет представлять graphQL-запрос, отправленный клиентом.

import lombok.Data;

@Data
public class GraphQLRequest {
   private String query;
   private String operationName;
   private Map<String, Object> variables;
}
Войти в полноэкранный режим Выход из полноэкранного режима

5. Создадим класс контроллера для обработки GraphQL-запросов (GraphQLController).

Этот GraphQLController будет содержать в основном две конечные точки

  • POST конечная точка: для приема GraphQL запроса и возврата данных
  • GET конечная точка : для возврата схемы GraphQL

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/graphql")
public class GraphQLController {

    private final GraphQL graphQL;
    private final GraphQLSchema schema;
    private final SchemaPrinter schemaPrinter;

    @GetMapping(produces = MediaType.TEXT_PLAIN_VALUE)
    public String schema() {
        return schemaPrinter.print(schema);
    }

    @PostMapping
    public Object execute(@RequestBody GraphQLRequest graphQLRequest) {
        Map<String, Object> variables = Optional.ofNullable(graphQLRequest.getVariables())
                .orElse(new HashMap<>());

        ExecutionInput input = new ExecutionInput
                .Builder()
                .query(graphQLRequest.getQuery())
                .operationName(graphQLRequest.getOperationName())
                .variables(variables).build();

        ExecutionResult execute = graphQL.execute(input);

        Map<String, Object> result = new HashMap<>();
        result.put("data", execute.getData());

        //set error if any
        if (!execute.getErrors().isEmpty()) {
            result.put("error", execute.getErrors());
        }
        return result;
    }

}

Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь мы создали простое приложение Spring с GraphQL.

Вот github repo для этого демо https://github.com/vijaypatidar/graph-ql-java

Оцените статью
devanswers.ru
Добавить комментарий