Структура GraphQL JSON to Go - PullRequest
       12

Структура GraphQL JSON to Go

1 голос
/ 19 сентября 2019

У меня есть запрос GraphQL, который выглядит следующим образом:

{
    actor {
      entitySearch(query: "name LIKE 'SOME_NAME'") {
        results {
          entities {
            guid
          }
        }
      }
    }
  }

Я не могу понять, как создать структуру Go для хранения возвращаемых данных.Единственное, что меня волнует, это поле guid, которое возвращается.

Это явно не работает:

type graphQlResponse struct {
    guid string
}

Любая помощь?Или есть способ, которым я могу просто получить руководство и сохранить его в строке без структуры?

Вот весь код.Я не получаю сообщение об ошибке, но 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)
}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

В GraphQL форма возвращенного JSON будет соответствовать форме запроса GraphQL: у вас будет поле "data", в котором будет дочерний элемент "actor", который будет содержать "entitySearch" и т. Д.Библиотека, которую вы вызываете, на самом деле довольно минимальна.Учитывая обычный транспортный формат HTTP , он использует обычное encoding/json декодирование для декодирования ответа.Какую бы структуру вы ни предоставили, она должна быть в состоянии демонтировать поле "data".

Это означает, что вам нужно создать вложенный набор структур, который отражает формат JSON, который, в свою очередь, отражает ваш запрос 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, но не библиотеки, которую вы упоминаете как таковую.

0 голосов
/ 19 сентября 2019

Я предлагаю использовать карту и пакет json.

Я не знаком с graphQL, поэтому сделаю обычный HTTP-запрос и надеюсь, что вы сможете использовать его для определения собственной проблемы:

response, err := http.Get("https://example.com")
// error checking code omitted
defer response.Body.Close()

// now we want to read the body, easiest way is with the ioutil package,
// this should work with the graphQL response body assuming it satisfies
// the io.Reader interface. This gets us the response body as a byte slice
body, err := ioutil.ReadAll(response.Body)

// next make a destination map, interface can be used in place of string or int
// if you need multiple types
jsonResult := map[string]string{"uuid": ""}

// finally, we use json.Unmarshal to write our byte slice into the map
err = json.Unmarshal(body, &jsonResult)

// now you can access your UUID
fmt.Println(jsonResult["uuid"])

Я предполагаю, что ответ REST иОтвет GraphQL аналогичен, если это не так, дайте мне знать, к какому типу относится тело запроса, и я могу помочь вам найти более подходящее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...