Files
go-simple-graphql/README.md
T

2.9 KiB

Simple GraphQL client

Run unit tests codecov Go Reference

Ps. It's Hasura friendly.

Reasoning

I've tried to run a few GraphQL clients with Hasura, all of them required conversion of the data into the appropriate structures, causing issues with non-existing types ( thanks to Hasura ), for example, bigint which was difficult to export. Therefore, I present you the simple client to which you can copy & paste your graphQL query, variables and you are good to go.

Features

  • Executing GraphQL queries as they are, without types declaration
  • HTTP2 support!
  • Support for additional headers
  • Query cache

Usage example

Environment variables

  • GRAPHQL_ENDPOINT - Your GraphQL endpoint. Default: http://127.0.0.1:9090/v1/graphql
  • GRAPHQL_CACHE - Should the query cache be enabled? Default: false
  • GRAPHQL_CACHE_TTL - Cache TTL in seconds for SELECT type of queries. Default: 5
  • LOG_LEVEL - Logging level. Default: info
  • RETRIES_ENABLE - Should retries be enabled? Default: false
  • RETRIES_NUMBER - Number of retries: Default: 1
  • RETRIES_DELAY - Delay in retries in milliseconds. Default: 250

Example reader code

import (
  fmt
  graphql "github.com/lukaszraczylo/go-simple-graphql"
)

headers := map[string]interface{}{
  "x-hasura-user-id":   37,
  "x-hasura-user-uuid": "bde1962e-b42e-1212-ac10-d43fa27f44a5",
}

variables := map[string]interface{}{
  "fileHash": "123deadc0w321",
}

query := `query searchFileKnown($fileHash: String) {
  tbl_file_scans(where: {file_hash: {_eq: $fileHash}}) {
  	racy
  	violence
  	virus
  }
}`

gql := graphql.NewConnection()
result, err := gql.Query(query, variables, headers)
if err != nil {
  fmt.Println("Query error", err)
  return
}
fmt.Println(result)

Result

{"tbl_user_group_admins":[{"id":109,"is_admin":1}]}

Working with results

I'm using an amazing library tidwall/gjson to parse the results and extract the information required in further steps and I strongly recommend this approach as the easiest and close to painless, for example:

result := gjson.Get(result, "tbl_user_group_admins.0.is_admin").Bool()
if result {
  fmt.Println("User is an admin")
}