@zombiezen's GraphQL Go Server
This repository contains Go packages for creating a GraphQL server. The primary focus is on simplicity and efficiency of the server endpoints.
go get zombiezen.com/go/graphql-server/graphql
Comparison With Other Libraries
A quick look at the official GraphQL libraries for Go may leave you wondering, "why another server library?" Simply, @zombiezen hit roadblocks to writing apps with other libraries and wanted to try a different API approach.
This library intentionally focuses on:
- using the GraphQL interface definition language (IDL) to define types
- allowing resolver functions to avoid unnecessary work by allowing inspection of their selection set
- simplifying testing by exposing a rich value API
- permitting any serialization format, but supporting JSON over HTTP out-of-the-box
github.com/graphql-go/graphql follows the
implementation, basically replicating its API verbatim. Unfortunately, this
leads to a fairly verbose approach to defining the server's schema in code
rather than the GraphQL IDL. Further, while you can do limited look-ahead of
output selection sets via
ResolveInfo, this only returns the ASTs and
requires the caller to interpret the fragments themselves
(graphql-go/graphql#157). The library also doesn't provide any
out-of-the-box utilities for serving over HTTP.
@zombiezen very much liked the approach that
github.com/graph-gophers/graphql-go took toward the problem: it uses the
IDL and the Go type system rather than a large package-specific data structure.
This results in a small ramp-up time and application code that is fairly
straightforward to follow.
However, the library has a few issues. It does not support look-ahead at all
(graph-gophers/graphql-go#17). The API conflates schema parsing with server
object binding (i.e.
graphql.ParseSchema takes a resolver), so many
servers end up passing dependencies through the
Context. The library makes it
difficult to test servers that use it, since its responses are always
JSON-formatted, which makes it hard to compare specific fields. While JSON is a
common serialization format used with GraphQL, the spec permits any