2016-04-01 19 views
2

Ich versuche, eine GraphQL endpoints in golang zu bauen.Konzepte von GraphQL und Relais

Ich verfolge diesen Blogs Learn Golang + GraphQL + Relay #1 für die Umsetzung von graphQl in golang und ich habe erfolgreich einfache Endpunkte GraphQL gebaut.

Es gibt nur wenige Konzepte, die mir noch unklar sind, wie kann ich ein pagination Endpunkte mit graphQl, bauen Auch Methoden wie

//How to build endpoints for fetching data from this query 
friends.first(1){ 
    cursor, 
    node { 
     name 
    } 
} 

//or this query 
friends.last(1){ 
    cursor, 
    node { 
     name 
    } 
} 

Introducing Relay and GraphQL

Wie, ich bin von Angular Hintergrund dieses Relay Konzept sind für mich immer noch sehr verwirrend. Wie Relay die Kommunikation zwischen Clients und Server erleichtert.

Bitte geben Sie einige Beispiel Knoten oder irgendetwas verwendet, die diese Konzepte klarer

+2

Seitenzahlen sind nicht Teil der GraphQL Spezifikation, aber es ist ein Teil der Relais-Bibliothek als [Verbindungen] (https://facebook.github.io/relay/docs/ graphql-connections.html). Sie können Paginierungen ohne Relay implementieren, indem Sie Eingabeargumente für Ihre GraphQL-Objekte definieren. Btw, die Beispiel-GraphQL-Abfrage, die Sie haben, scheint ein bisschen wackelig. Es sollte 'friends (first: 1) {cursor, node {name}}' sein, wobei 'friends' das' first' Eingabeargument vom Typ GraphQLInt akzeptiert. Ich werde versuchen, Zeit zu finden, um ein Beispiel für die Seitennummerierung für "graphql-go" zu erstellen. Es scheint, als wäre es für viele Leute sehr nützlich. –

+2

Ich habe meine Kommentare hier https://github.com/graphql-go/graphql/issues/120 ausgearbeitet –

Antwort

4

Paginierung ist nie eine einfache Frage und nicht eine explizit gelöst durch GraphQL machen. GraphQL stellt ein Datenabrufframework zur Verfügung. Wie dieses Framework für Dinge verwendet wird (wie Paginierung), liegt beim Entwickler.

Das Team Relay hat versucht, die Paginierung mit der Cursorverbindung specification für GraphQL zu standardisieren. Die Cursor-Verbindungsspezifikation ist nicht für Relay eindeutig und kann mit Angular verwendet werden. Das Hauptziel der Spezifikation besteht darin, eine standardisierte Möglichkeit für die Arbeit mit großen Sammlungen von einem GraphQL-Server bereitzustellen. Die wichtigste Sache, die über diese Spezifikation zu beachten ist, ist, dass mit jedem Objekt ein Cursor verbunden ist. Mit diesem zugeordneten Cursor kann der Client die Seitennumerierung von jedem Punkt in der Sammlung aus fortsetzen.

Wenn Sie an der Implementierung der Relaisspezifikation interessiert sind, empfehle ich Ihnen, Sashko Stubailos Understanding pagination: REST, GraphQL, and Relay zu lesen, wo er die Motivation hinter den Relaisverbindungsspezifikationen erklärt und erklärt, wie sie implementiert werden.

Um die Verbindungsspezifikation in Aktion zu sehen, werfen Sie einen Blick auf das Beispiel SWAPI GraphQL API, das die Relay-Spezifikation in GraphQL implementiert. Ich ermutige Sie, das Dokumentationsfenster zu öffnen und die PeopleConnection zu durchsuchen. Beachten Sie, wie sie die Felder edges und people implementieren.

Wenn die Paginierung des Cursors für die Verwendung/Implementierung zu kompliziert ist, können Sie für Ihre GraphQL-API immer eine herkömmliche Paginierung für Limit/Offset anzeigen. Die Schnittstelle würde wahrscheinlich so etwas wie folgt aussehen:

{ 
    friends(limit: 5, offset: 20) { 
    name 
    } 
} 

Schließlich ist die Abfrage, die Sie von einem sehr frühen technische Vorschau von GraphQL vorgesehen ist und eigentlich nicht der Spezifikation (source) entsprechen. Eine entsprechende Abfrage (wie von Hafiz erwähnt) wäre:

{ 
    friends(first: 1) { 
    cursor 
    node { 
     name 
    } 
    } 
} 

Es gibt zwei große Gespräche von React Europe 2015, die ich empfehlen Sie auch beobachten, die mehr über GraphQL ohne Relais sprechen.