Golang,如何使用结构通过HTTP编写JSON响应?

时间:2017-11-25 11:20:01

标签: http go

目标:

使用github.com/neelance/graphql-go starwars示例,我试图向我的ReactJS客户端写一个JSON响应。这个结构对我来说是全新的,Golang以及btw。

问题:

为了获得对以下示例GraphQL查询的适当响应,data变量应该是什么?

query clientQuery {
  character(id: 1000) {
    name
    appearsIn
  }
}

其他信息:

从我在这里和那里读到的内容,data必须是某种结构。我在示例中提供了大量结构(请参阅下面的starwars.go)。

要修改的代码(main.go):

package main

import (
    "encoding/json"
    "log"
    "net/http"

    "github.com/neelance/graphql-go"
    "github.com/neelance/graphql-go/example/starwars"
    "github.com/neelance/graphql-go/relay"
)

var schema *graphql.Schema

func init() {
    schema = graphql.MustParseSchema(starwars.Schema, &starwars.Resolver{})
}

func main() {

    port := ":8080"
    log.Printf(`GraphQL server starting up on http://localhost%v`, port)

    http.Handle("/query", &relay.Handler{Schema: schema})

    http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) {

        // THIS IS SUPER WRONG, data should be something
        // like data := starwars.Resolver{} or so?
        data := `{"data":{"character":{"name":"Luke Skywalker","appearsIn":["NEWHOPE","EMPIRE","JEDI"]}}}`

        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusCreated)
        json.NewEncoder(w).Encode(data)
    })

    log.Fatal(http.ListenAndServe(port, nil))
}

参考1 - starwars.go

参考2 - relay.go

1 个答案:

答案 0 :(得分:0)

你的问题有点令人困惑。 您询问的是JSON,但您想要的响应不是有效的JSON格式: 看起来您添加了无关的GraphQL信息。

我不确定这是关于GraphQL还是JSON的问题。无论如何我会尽力回答。

您的示例data看起来像这样,因此我假设这是您要生成的结果:

data := `{"data":{"character":{"name":"Luke Skywalker","appearsIn":["NEWHOPE","EMPIRE","JEDI"]}}}`

使Go生成适当的JSON的一种简洁方法是创建包含数据的Structs:

type Response struct {
    Data Data `json:"data"`
}

type Data struct {
    Character Character `json:"characer"`
}

type Character struct {
    Name      string   `json:"name"`
    AppearsIn []string `json:"appearsIn"`
}

然后你可以像这样定义数据:

    data := Response{
        Data: Data{
            Character: Character{
                Name:      "Luke Skywalker",
                AppearsIn: []string{"NEWHOPE", "EMPIRE", "JEDI"},
            },
        },
    }

也许这个问题不是关于JSON而是关于GraphQL。在这种情况下,您需要澄清您的问题。

<强>参考