Apollo-link-rest: Un support possible pour Dgraph via le point de terminaison HTTP brut

CrĂ©Ă© le 6 nov. 2018  Â·  7Commentaires  Â·  Source: apollographql/apollo-link-rest

Ce serait comme un mĂ©lange de GraphQL avec GraphQL + - de Dgraph. Cependant, si nous pouvions injecter la requĂȘte Dgraph comme nous le faisons dans cURL. Dgraph serait entiĂšrement compatible avec Apollo.

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

Plus d'infos sur : https://docs.dgraph.io/clients/#raw -http

par exemple;

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

`` JS const query = gql
requĂȘte Dgraphe {
appartements(func: eq(neighborhood.name, "Lutyens")) @rest(type: "query", path: "query", endpoint: "DgraphEnd") {
bhk
fluide
}
}
`;

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

Acclamations.

enhancement💡

Tous les 7 commentaires

J'ai dĂ©couvert que nous pouvons passer la requĂȘte Dgraph via le "corps brut" dans Postman. C'est donc un signe que Dgraph pourrait peut-ĂȘtre fonctionner avec apollo-link-rest

PS. Je pense que le "bodyBuilder: $customBuilder" peut ĂȘtre la solution. Mais je ne sais pas comment cela fonctionne.

image

BTW, vous pouvez tester sur https://play.dgraph.io/query
pointez simplement le facteur sur ce point de terminaison, dĂ©finissez "POST" et dans Body, dĂ©finissez RAW et collez la requĂȘte ci-dessous.

Faites attention que l'UID peut changer Ă  l'avenir

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

Cela ressemble à un grand projet. -- Je ne pense pas que la partie difficile soit d'utiliser apollo-link-rest -- comme vous l'avez dit, il s'agit essentiellement d'utiliser la customBodyBuilder , ou d'utiliser une implémentation de customFetch . -- Je pense que la partie la plus difficile sera de "générer" les bonnes charges utiles compatibles Dgraph .

S'il vous plaĂźt laissez-nous savoir ce que vous comprenez - mais il me semble que vous devrez crĂ©er un "gĂ©nĂ©rateur de requĂȘtes" assez complet qui serait utilisĂ© comme implĂ©mentation customFetch.

Dgraph est une base de données dont le langage est inspiré de GraphQL. Cela s'appelle "GraphQL + -". C'est un graphe DB avec un langage graphique. Cependant, de nombreuses fonctionnalités n'existent pas dans GraphQL, mais sont toujours compatibles. Et effectivement c'est un gros projet.

Je pense que nous pouvons travailler sur Dgraph pour prendre en charge apollo-link-rest, mais je voulais comprendre si je peux déjà faire quelque chose avec ce qui est disponible (comme un "Hack"). Je n'ai trouvé aucun exemple personnalisable qui pourrait envoyer le "Corps" comme je l'ai illustré en utilisant Postman.

Injecter le corps avec du texte RAW serait un moyen facile de faire fonctionner Dgraph avec apollo-link-rest. Parce que la réponse est en JSON. Il n'y a pas de secret.

En regardant ce projet Apollo, je vois un grand potentiel avec Dgraph.

Acclamations.

@MichelDiz -- si c'est le cas, on dirait presque que vous voudrez peut-ĂȘtre forker apollo-link-rest et crĂ©er apollo-link-dgraph

La meilleure solution serait peut-ĂȘtre de forker apollo-link-http ? -- cette couche parle GraphQL, donc gĂ©nĂ©rer une sortie de type GraphQL Ă  partir de GraphQL pourrait ĂȘtre plus simple ?

Pas sûr d'apollo-link-http, car Dgraph GraphQL+- n'est pas compatible avec graphql-tag tho.

J'avais dĂ©jĂ  essayĂ© sans succĂšs d'atteindre le lien Apollo avec le point de terminaison de Dgraph, et le corps de la requĂȘte est diffĂ©rent. Alors que /graphql accepte la requĂȘte en "clĂ© de requĂȘte", Dgraph n'a pas de champ "RequĂȘte", juste un champ RAW. Mais je pense que cela peut ĂȘtre Ă©valuĂ©. Je ne suis pas le dev (go lang) de Dgraph, mais je parle de cette situation avec l'Ă©quipe.

Les principales diffĂ©rences sont donc la balise graphql et la position de la charge utile de la requĂȘte. Comme apollo-link-rest utilise Ă©galement graphql-tag, j'ai pensĂ© Ă  crĂ©er une directive @' pour injecter la requĂȘte Dgraph (en tant que corps) et utiliser Ă©galement GraphQL. Tout comme vous le faites dans "path:". Mais ce n'est que spĂ©culation. L'idĂ©e est encore prĂ©maturĂ©e.

par exemple:

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);
});

Vous trouverez ci-dessous la diffĂ©rence entre le corps de requĂȘte de Dgraph et de 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 de 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--

Passer directement Ă  DGraph depuis le client semble ĂȘtre un dĂ©fi, et qui peut ne pas laisser de place Ă  des concepts tels que l'autorisation ou la logique mĂ©tier. Non pas que cela n'aurait pas d'utilitĂ©, bien sĂ»r - un lien comme celui que vous dĂ©crivez serait idĂ©al pour crĂ©er un client qui explore facilement un graphe public directement.

Je suis intĂ©ressĂ© par l'utilisation de DGraph comme magasin de donnĂ©es principal pour une application grand public, donc j'adopte une approche diffĂ©rente et j'essaie de rendre trĂšs facile l'interface d'une application Apollo Server standard Ă  un backend DGraph en convertissant les requĂȘtes GraphQL entrantes en requĂȘtes DGraph en utilisant un AST personnalisĂ© (inspirĂ© de projets comme join-monster ). Cependant, je suis toujours en train de mettre l'idĂ©e sur un tableau blanc pendant mon temps libre, donc aucune promesse de livraison.

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

Peut-ĂȘtre que toute couche de conversion de requĂȘte que je crĂ©e pourrait Ă©galement ĂȘtre portable cĂŽtĂ© client, de sorte qu'elle puisse ĂȘtre extraite dans une bibliothĂšque rĂ©utilisable qu'un hypothĂ©tique apollo-link-dgraph pourrait Ă©galement utiliser. Actuellement, cependant, je compte beaucoup sur la capacitĂ© de lire le schĂ©ma lui-mĂȘme pour gĂ©nĂ©rer cet AST.

Cette page vous a été utile?
0 / 5 - 0 notes