Apollo-link-rest: Um suporte possível para Dgraph por meio de ponto de extremidade HTTP bruto

Criado em 6 nov. 2018  ·  7Comentários  ·  Fonte: apollographql/apollo-link-rest

Seria como uma mistura de GraphQL com GraphQL + - da Dgraph. No entanto, se pudéssemos injetar a consulta Dgraph como fazemos em cURL. Dgraph seria totalmente compatível com Apollo.

curl -X POST -H 'X-Dgraph-LinRead: {"1": 12}' localhost:8080/query -d $'
{
  balances(func: anyofterms(name, "Alice Bob")) {
    uid
    name
    balance
  }
}' | jq

Mais informações em: https://docs.dgraph.io/clients/#raw -http

por exemplo;

const query = gql`
  query Dgraph {
    apartments@rest(type: "query", path: "query", endpoint: "DgraphEnd") {
      bhk
      uid
    }
  }
`;

`` JS const query = gql
query Dgraph {
apartamentos (func: eq (Neighborhood.name, "Lutyens")) @rest (type: "query", path: "query", endpoint: "DgraphEnd") {
bhk
uid
}
}
`;

Mutation example:

```bash
curl -X POST localhost:8080/mutate -H 'X-Dgraph-MutationType: json' -H 'X-Dgraph-CommitNow: true' -d  $'
    {
      "set": [
      {"name": "Alice"},
      {"name": "Bob"}
    ]
      }' | jq

Felicidades.

enhancement💡

Todos 7 comentários

Descobri que podemos passar a Consulta Dgraph através do "Corpo bruto" no Postman. Então isso é um sinal de que talvez seja possível Dgraph trabalhar com apollo-link-rest

PS. Acho que o "bodyBuilder: $ customBuilder" pode ser o caminho. Mas não tenho certeza de como isso funciona.

image

BTW, você pode testar https://play.dgraph.io/query
basta apontar o Postman para esse endpoint, definir "POST" e em Body definir RAW e colar a consulta abaixo.

Preste atenção que o UID pode mudar no futuro

{
  node(func: uid(0x36bb9)) {
    uid
    expand(_all_) {
      uid
      expand(_all_)
    }
  }
}

Parece um grande projeto. - Não acho que a parte difícil seja usar apollo-link-rest - como você disse, é basicamente usar customBodyBuilder , ou usar uma implementação customFetch . - Acho que a parte difícil será "gerar" as cargas úteis compatíveis com Dgraph corretas.

Por favor, deixe-nos saber o que você descobriu - mas parece-me que você precisará fazer um "Gerador de Consultas" bastante extenso que seria usado como uma implementação customFetch.

Dgraph é um banco de dados que tem sua linguagem inspirada no GraphQL. É chamado de "GraphQL + -". É um gráfico de banco de dados com uma linguagem de gráfico. No entanto, existem muitos recursos que não existem no GraphQL, mas ainda são compatíveis. E de fato é um grande projeto.

Acho que podemos trabalhar no Dgraph para dar suporte ao apollo-link-rest, mas eu queria entender se já posso fazer algo com o que está disponível (como um "hack"). Não encontrei nenhum exemplo personalizável que pudesse enviar o "Corpo" como exemplifiquei usando o Postman.

Injetar o corpo com texto RAW seria uma maneira fácil de fazer o Dgraph funcionar com apollo-link-rest. Porque a resposta está em JSON. Não tem segredo.

Olhando para este projeto Apollo eu vejo um grande potencial com Dgraph.

Felicidades.

@MichelDiz - se for esse o caso, quase parece que você pode querer fazer um fork de apollo-link-rest e fazer apollo-link-dgraph

Possivelmente, a melhor solução seria desembolsar apollo-link-http ? - essa camada fala GraphQL, portanto, gerar saída do tipo GraphQL a partir do GraphQL pode ser mais fácil?

Não tenho certeza sobre apollo-link-http, porque Dgraph GraphQL + - não é compatível com graphql-tag tho.

Eu havia tentado antes, sem sucesso, acessar o link Apollo com o endpoint do Dgraph, e o corpo da solicitação é diferente. Embora / graphql aceite a consulta em "chave de consulta", Dgraph não possui um campo "Consulta", apenas um campo RAW. Mas acho que isso pode ser avaliado. Não sou o dev do Dgraph (vá lang), mas estou falando sobre essa situação com a equipe.

Portanto, as principais diferenças são a tag graphql e a posição da carga útil da consulta. Como apollo-link-rest também usa graphql-tag, pensei em criar uma diretiva @ 'para injetar a consulta Dgraph (como corpo) e usar GraphQL também. Assim como você faz em "path:". Mas isso é apenas especulação. A ideia ainda é prematura.

por exemplo:

const dgraphQ = ` 
{ 
  users (func: has(user), first:1000 ) {
   id : uid
   name
   email
}
}
`;

const query = gql`
      query dgraphTest(
        $customBuilder: any
      ) {
        users @rest(type: "User ", bodyBuilder: $customBuilder, method: "POST") { 
                                         #Maybe bodyKey?? I'll test it
          id
          name
          email
        }
      }
    `;

apolloClient.query({
  query: Query,
  variables: {
    input: { customBuilder: dgraphQ }
  }
}).then(response => {
  console.log(response);
});

Abaixo está a diferença entre o corpo da solicitação de Dgraph e GraphQL.

GraphQL

POST /graphql HTTP/1.1
Host: api.githunt.com
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
query=%7B%0A++++feed+(type%3A+NEW%2C+limit%3A+5)+%7B%0A++++++repository+%7B%0A++++++++owner+%7B+login+%7D%0A++++++++name%0A++++++%7D%0A%0A++++++postedBy+%7B+login+%7D%0A++++%7D%0A++%7D%0A++

GraphQL + do Dgraph -

POST /query HTTP/1.1
Host: play.dgraph.io
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
{
  node(func: uid(0x36bb9)) {
    uid
    expand(_all_) {
      uid
      expand(_all_)
    }
  }
}------WebKitFormBoundary7MA4YWxkTrZu0gW--

Ir diretamente do cliente para o DGraph parece um desafio, e pode não deixar espaço para conceitos como autorização ou lógica de negócios. Não que não tivesse utilidade, com certeza - um link como você descreve seria ótimo para criar um cliente que explora facilmente um gráfico público diretamente.

Estou interessado em usar DGraph como o armazenamento de dados principal para um aplicativo de consumidor, então estou usando uma abordagem diferente e tentando tornar muito fácil fazer a interface de um aplicativo Apollo Server padrão para um back-end DGraph, convertendo consultas GraphQL de entrada em consultas DGraph usando um AST personalizado (inspirado em projetos como join-monster ). Ainda estou pensando na ideia em meu tempo livre, então sem promessas na entrega.

https://github.com/a-type/dgraphql

Talvez qualquer camada de conversão de consulta que eu crie possa ser portável para o cliente também, de modo que possa ser extraída para uma biblioteca reutilizável que um hipotético apollo-link-dgraph também possa utilizar. Atualmente, porém, confio muito em ser capaz de ler o próprio esquema para gerar esse AST.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sinisterra picture sinisterra  ·  6Comentários

Daniel-Griffiths picture Daniel-Griffiths  ·  5Comentários

kevinrobayna picture kevinrobayna  ·  6Comentários

eranimo picture eranimo  ·  5Comentários

dphaener picture dphaener  ·  5Comentários