mirror of
https://github.com/lukaszraczylo/go-simple-graphql.git
synced 2026-10-13 00:48:37 +00:00
90 lines
2.9 KiB
Markdown
90 lines
2.9 KiB
Markdown
# Simple GraphQL client
|
|
|
|
[](https://github.com/lukaszraczylo/simple-gql-client/actions/workflows/test.yaml) [](https://codecov.io/gh/lukaszraczylo/simple-gql-client) [](https://pkg.go.dev/github.com/lukaszraczylo/simple-gql-client)
|
|
|
|
Ps. It's Hasura friendly.
|
|
|
|
- [Simple GraphQL client](#simple-graphql-client)
|
|
- [Reasoning](#reasoning)
|
|
- [Features](#features)
|
|
- [Usage example](#usage-example)
|
|
- [Environment variables](#environment-variables)
|
|
- [Example reader code](#example-reader-code)
|
|
- [Working with results](#working-with-results)
|
|
|
|
## 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
|
|
|
|
|
|
```go
|
|
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**
|
|
|
|
```json
|
|
{"tbl_user_group_admins":[{"id":109,"is_admin":1}]}
|
|
```
|
|
|
|
## Working with results
|
|
|
|
I'm using an amazing library [tidwall/gjson](https://github.com/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:
|
|
|
|
```go
|
|
result := gjson.Get(result, "tbl_user_group_admins.0.is_admin").Bool()
|
|
if result {
|
|
fmt.Println("User is an admin")
|
|
}
|
|
``` |