我有一个如下所示的 GraphQL 查询:
{
actor {
entitySearch(query: "name LIKE 'SOME_NAME'") {
results {
entities {
guid
}
}
}
}
}
我不知道如何创建 Go 结构来保存返回的数据。我唯一关心的是返回的 guid
字段。
这显然行不通:
type graphQlResponse struct {
guid string
}
有什么帮助吗?或者有没有一种方法可以简单地获取 guid 并将其存储在没有结构的字符串中?
这是完整的代码。我没有收到错误,但 guid 是一个空字符串:
package main
import (
"context"
"fmt"
"log"
"github.com/machinebox/graphql"
)
func main() {
type graphQlResponse struct {
guid string
}
// create a client (safe to share across requests)
client := graphql.NewClient("GraphQL EndPoint")
// make a request
req := graphql.NewRequest(`
{
actor {
entitySearch(query: "name LIKE 'SOME_NAME'") {
results {
entities {
guid
}
}
}
}
}
`)
// set any variables
//req.Var("key", "value")
// set header fields
//req.Header.Set("Cache-Control", "no-cache")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("API-Key", "KEY_HERE")
// define a Context for the request
ctx := context.Background()
// run it and capture the response
var respData graphQlResponse
if err := client.Run(ctx, req, &respData); err != nil {
log.Fatal(err)
}
fmt.Println(respData.guid)
}
最佳答案
在 GraphQL 中,返回的 JSON 的形状将与 GraphQL 查询的形状匹配:您将有一个 “data”
字段,该字段将有一个 “actor”
子级,其中将包含“entitySearch”
,依此类推。您所调用的库实际上非常小。鉴于the conventional HTTP transport format ,它uses ordinary encoding/json
decoding解码响应。无论您提供什么结构,都需要能够解码“data”
字段。
这意味着您需要创建一组反射(reflect) JSON 格式的嵌套结构,进而反射(reflect)您的 GraphQL 查询:
type Entity struct {
Guid string `json:"guid"`
}
type Result struct {
Entities Entity `json:"entities"`
}
type EntitySearch struct {
Results Result `json:"results"`
}
type Actor struct {
EntitySearch EntitySearch `json:"entitySearch"`
}
type Response struct {
Actor Actor `json:"actor"`
}
fmt.Println(resp.Actor.EntitySearch.Results.Entities.Guid)
https://play.golang.org/p/ENCIjtfAJif有一个使用此结构和人工 JSON 主体的示例,尽管不是您提到的库。
关于json - GraphQL JSON 到 Go 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58017536/