• Stars
    star
    702
  • Rank 64,499 (Top 2 %)
  • Language
    Go
  • License
    MIT License
  • Created over 7 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Package graphql provides a GraphQL client implementation.

graphql

Go Reference

Package graphql provides a GraphQL client implementation.

For more information, see package github.com/shurcooL/githubv4, which is a specialized version targeting GitHub GraphQL API v4. That package is driving the feature development.

Installation

go get github.com/shurcooL/graphql

Usage

Construct a GraphQL client, specifying the GraphQL server URL. Then, you can use it to make GraphQL queries and mutations.

client := graphql.NewClient("https://example.com/graphql", nil)
// Use client...

Authentication

Some GraphQL servers may require authentication. The graphql package does not directly handle authentication. Instead, when creating a new client, you're expected to pass an http.Client that performs authentication. The easiest and recommended way to do this is to use the golang.org/x/oauth2 package. You'll need an OAuth token with the right scopes. Then:

import "golang.org/x/oauth2"

func main() {
	src := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: os.Getenv("GRAPHQL_TOKEN")},
	)
	httpClient := oauth2.NewClient(context.Background(), src)

	client := graphql.NewClient("https://example.com/graphql", httpClient)
	// Use client...

Simple Query

To make a GraphQL query, you need to define a corresponding Go type.

For example, to make the following GraphQL query:

query {
	me {
		name
	}
}

You can define this variable:

var query struct {
	Me struct {
		Name graphql.String
	}
}

Then call client.Query, passing a pointer to it:

err := client.Query(context.Background(), &query, nil)
if err != nil {
	// Handle error.
}
fmt.Println(query.Me.Name)

// Output: Luke Skywalker

Arguments and Variables

Often, you'll want to specify arguments on some fields. You can use the graphql struct field tag for this.

For example, to make the following GraphQL query:

{
	human(id: "1000") {
		name
		height(unit: METER)
	}
}

You can define this variable:

var q struct {
	Human struct {
		Name   graphql.String
		Height graphql.Float `graphql:"height(unit: METER)"`
	} `graphql:"human(id: \"1000\")"`
}

Then call client.Query:

err := client.Query(context.Background(), &q, nil)
if err != nil {
	// Handle error.
}
fmt.Println(q.Human.Name)
fmt.Println(q.Human.Height)

// Output:
// Luke Skywalker
// 1.72

However, that'll only work if the arguments are constant and known in advance. Otherwise, you will need to make use of variables. Replace the constants in the struct field tag with variable names:

var q struct {
	Human struct {
		Name   graphql.String
		Height graphql.Float `graphql:"height(unit: $unit)"`
	} `graphql:"human(id: $id)"`
}

Then, define a variables map with their values:

variables := map[string]any{
	"id":   graphql.ID(id),
	"unit": starwars.LengthUnit("METER"),
}

Finally, call client.Query providing variables:

err := client.Query(context.Background(), &q, variables)
if err != nil {
	// Handle error.
}

Inline Fragments

Some GraphQL queries contain inline fragments. You can use the graphql struct field tag to express them.

For example, to make the following GraphQL query:

{
	hero(episode: "JEDI") {
		name
		... on Droid {
			primaryFunction
		}
		... on Human {
			height
		}
	}
}

You can define this variable:

var q struct {
	Hero struct {
		Name  graphql.String
		Droid struct {
			PrimaryFunction graphql.String
		} `graphql:"... on Droid"`
		Human struct {
			Height graphql.Float
		} `graphql:"... on Human"`
	} `graphql:"hero(episode: \"JEDI\")"`
}

Alternatively, you can define the struct types corresponding to inline fragments, and use them as embedded fields in your query:

type (
	DroidFragment struct {
		PrimaryFunction graphql.String
	}
	HumanFragment struct {
		Height graphql.Float
	}
)

var q struct {
	Hero struct {
		Name          graphql.String
		DroidFragment `graphql:"... on Droid"`
		HumanFragment `graphql:"... on Human"`
	} `graphql:"hero(episode: \"JEDI\")"`
}

Then call client.Query:

err := client.Query(context.Background(), &q, nil)
if err != nil {
	// Handle error.
}
fmt.Println(q.Hero.Name)
fmt.Println(q.Hero.PrimaryFunction)
fmt.Println(q.Hero.Height)

// Output:
// R2-D2
// Astromech
// 0

Mutations

Mutations often require information that you can only find out by performing a query first. Let's suppose you've already done that.

For example, to make the following GraphQL mutation:

mutation($ep: Episode!, $review: ReviewInput!) {
	createReview(episode: $ep, review: $review) {
		stars
		commentary
	}
}
variables {
	"ep": "JEDI",
	"review": {
		"stars": 5,
		"commentary": "This is a great movie!"
	}
}

You can define:

var m struct {
	CreateReview struct {
		Stars      graphql.Int
		Commentary graphql.String
	} `graphql:"createReview(episode: $ep, review: $review)"`
}
variables := map[string]any{
	"ep": starwars.Episode("JEDI"),
	"review": starwars.ReviewInput{
		Stars:      graphql.Int(5),
		Commentary: graphql.String("This is a great movie!"),
	},
}

Then call client.Mutate:

err := client.Mutate(context.Background(), &m, variables)
if err != nil {
	// Handle error.
}
fmt.Printf("Created a %v star review: %v\n", m.CreateReview.Stars, m.CreateReview.Commentary)

// Output:
// Created a 5 star review: This is a great movie!

Directories

Path Synopsis
ident Package ident provides functions for parsing and converting identifier names between various naming convention.
internal/jsonutil Package jsonutil provides a function for decoding JSON into a GraphQL query data structure.

License

More Repositories

1

githubv4

Package githubv4 is a client library for accessing GitHub GraphQL API v4 (https://docs.github.com/en/graphql).
Go
1,118
star
2

vfsgen

Takes an input http.FileSystem (likely at go generate time) and generates Go code that statically implements it.
Go
982
star
3

Go-Package-Store

An app that displays updates for the Go packages in your GOPATH.
Go
899
star
4

markdownfmt

Like gofmt, but for Markdown.
Go
796
star
5

goexec

A command line tool to execute Go functions.
Go
374
star
6

gostatus

A command line tool that shows the status of Go repositories.
Go
244
star
7

github_flavored_markdown

GitHub Flavored Markdown renderer with fenced code block highlighting, clickable header anchor links.
Go
159
star
8

binstale

binstale tells you whether the binaries in your GOPATH/bin are stale or up to date.
Go
146
star
9

go

Common Go code.
Go
127
star
10

home

home is Dmitri Shuralyov's personal website.
Go
76
star
11

httpfs

Collection of Go packages for working with the http.FileSystem interface.
Go
62
star
12

Hover

A work-in-progress source port of Hover.
C++
59
star
13

eX0

Unfinished multiplayer tactical 2D shooter indie game.
C++
50
star
14

git-branches

git-branches prints the commit behind/ahead counts for branches.
Go
42
star
15

play

Short experimental programs for playing with and learning new things. No importable Go packages here.
JavaScript
38
star
16

gtdo

The source for gotools.org.
Go
36
star
17

tictactoe

Package tictactoe defines the game of tic-tac-toe.
Go
31
star
18

sanitized_anchor_name

Package sanitized_anchor_name provides a func to create sanitized anchor names.
Go
27
star
19

httpgzip

Package httpgzip provides net/http-like primitives that use gzip compression when serving HTTP requests.
Go
24
star
20

issuesapp

Package issuesapp is a web frontend for an issues service.
Go
23
star
21

godecl

A godecl experiment. Like cdecl, but for Go.
Go
20
star
22

cmd

Various small command-line utilities.
Go
18
star
23

frontend

Common frontend code.
HTML
13
star
24

notifications

Package notifications provides a notifications service definition.
Go
11
star
25

issues

Package issues provides an issues service definition.
Go
11
star
26

resume

resume is Dmitri Shuralyov's rΓ©sumΓ©.
Go
9
star
27

highlight_go

Syntax highlighter for Go, using go/scanner.
Go
8
star
28

octicon

Package octicon provides GitHub Octicons.
Go
8
star
29

webdavfs

Collection of Go packages for working with the webdav.FileSystem interface.
Go
8
star
30

notificationsapp

Package notificationsapp is a web frontend for a notifications service.
Go
8
star
31

events

Package events provides an events service definition.
Go
7
star
32

ivybrowser

A port of Rob Pike's ivy that runs in the browser.
Go
7
star
33

SLA

Service-level agreement for Go packages.
6
star
34

gofontwoff

Package gofontwoff provides the Go font family in Web Open Font Format.
CSS
5
star
35

vcsstate

Package vcsstate allows getting the state of version control system repositories.
Go
5
star
36

htmlg

Package for generating and rendering HTML nodes with context-aware escaping.
Go
5
star
37

reactions

Package reactions provides a reactions service definition.
HTML
3
star
38

highlight_diff

Syntax highlighter for diff format, with inner diff highlighting.
Go
2
star
39

users

Package users provides a users service definition.
Go
2
star
40

httperror

Package httperror provides common basic building blocks for custom HTTP frameworks.
Go
1
star