GraphQL Mesh: Migrando API REST sem esquema para GraphQL sem escrever nenhum código

GraphQL foi originalmente criado para fornecer facilmente uma API poderosa em cima do código existente. A abordagem atual que as pessoas estão usando ao migrar de API REST para o GraphQL é criar um novo esquema e usar o GraphQL como um proxy. Isso traz muitos benefícios, porque nos dá a oportunidade de repensar a API e melhorá-la, sem alterar os serviços por baixo dela.

Vamos primeiro começar observando essa abordagem:

Implementando um back-end de proxy GraphQL

Digamos que você tenha um endereço que faz todas as operações CRUD para a entidade , com diferentes métodos HTTP, e você precisaria de um esquema GraphQL como abaixo:

type Query {
user(id: ID): User
}
type Mutation {
createUser(input: UserInput): User
updateUser(id: ID, input: UserInput): User
deleteUser(id: ID): ID
}
type User {
id: ID
name: String
age: Int
}
input UserInput {
name: String
age: Int
}

E você também precisaria de uma lógica de negócios para atuar como proxy das solicitações GraphQL para a API REST usando resolvedores GraphQL como abaixo;

module.exports = {
Query: {
user: (root, args) => fetch('https://myrest.com/user/' + args.id)
.then(res => res.json())
},
Mutation: {
createUser: (root, args) => fetch('https://myrest.com/user', {
method: 'PUT',
body: JSON.stringify(args.input)
}).then(res => res.json()),
updateUser: (root, args) => fetch('https://myrest.com/user' + args.id, {
method: 'POST',
body: JSON.stringify(args.input)
}).then(res => res.json()),
deleteUser: (root, args) => fetch('https://myrest.com/user' + args.id, {
method: 'DELETE'
}).then(res => res.json()),
};

Este exemplo assume que você tem um endereço que obtém uma entidade com , exclui o usuário com e atualiza um com o id e payload fornecido. Além disso, o endereço cria um novo com o payload fornecido.

Mas essa implementação será difícil de manter quando a API REST for atualizada e se tornar maior.

Usando GraphQL Mesh ao invés código

GraphQL Mesh é uma ferramenta que lida com várias fontes de dados não GraphQL e gera um esquema GraphQL executável sobre elas com um arquivo de configuração simples. Você pode verificar o artigo de lançamento para saber mais.

Além de ter manipuladores que cuidam automaticamente de fontes com esquema como — OpenAPI / Swagger, gRPC, SOAP e outros, ele também tem manipuladores de esquema JSON que gera um esquema GraphQL com base nos arquivos de esquema JSON fornecidos. Esse manipulador também pode gerar o esquema JSON no tempo de execução com base no payload de solicitação e nos dados de resposta.

Primeiro você precisa criar um projeto, vamos usar em um diretório vazio:

yarn init

Depois disso, precisamos instalar algumas dependências do GraphQL Mesh:

yarn add @graphql-mesh/cli @graphql-mesh/json-schema graphql

Crie um que é um arquivo de configuração para GraphQL Mesh em nosso novo projeto:

sources:
- name: MyRest
handler:
jsonSchema:
baseUrl: https://myrest.com/
operations:
- type: Query
field: user
path: /user/{args.id}
method: GET
responseSample: ./getUserResponse.json
- type: Mutation
field: createUser
path: /user
method: POST
requestSample: ./createUserRequest.json
responseSample: ./createUserResponse.json
- type: Mutation
field: updateUser
path: /user/{args.id}
method: PUT
requestSample: ./updateUserRequest.json
responseSample: ./updateUserResponse.json
- type: Mutation
field: deleteUser
path: /user/{args.id}
method: DELETE
responseSample: ./deleteUserResponse.json

Como você pode ver na configuração, definimos nossos endereços sem uma única linha de código. Depois de criar este arquivo de configuração. Precisamos obter arquivos de solicitação e resposta de amostra, podemos fazer isso chamando esses endereços localmente.

Com um único comando, nosso novo servidor GraphQL está pronto para uso:

yarn mesh serve

Não é só um gateway, mas também, uma SDK totalmente segura

GraphQL Mesh é capaz de gerar um SDK com tipagem segura a partir da API GraphQL gerada porque o esquema GraphQL gerado é localmente. podem ser executados sem um servidor HTTP.

Isso significa que você pode usar o GraphQL Mesh dentro de seus serviços ou clientes existentes, como um SDK , apenas como uma dependência simples, sem adicionar outro componente em sua arquitetura.

Créditos

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store