DEV Community

Cover image for GraphQL Mesh: Migrando API REST sem esquema para GraphQL sem escrever nenhum código
Eduardo Rabelo
Eduardo Rabelo

Posted on • Edited on

4 1

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 /user que faz todas as operações CRUD para a entidade User, 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 /user/:id que obtém uma entidade User com HTTP GET, exclui o usuário com HTTP DELETEe atualiza um User com o id e payload fornecido. Além disso, o endereço /user cria um novo User 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 yarn 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 .meshrc.yml 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. GraphQLSchema 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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay