解析REST API响应

时间:2018-10-09 13:25:03

标签: json parsing go

我是golang的新手。我正在编写一个程序来解析API的json响应:https://httpbin.org/get。我已经使用以下代码来解析响应:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

type Headers struct {
    Close  string `json:"Connection"`
    Accept string `json:"Accept"`
}

type apiResponse struct {
    Header Headers `json:"headers"`
    URL    string  `json:"url"`
}

func main() {
    apiRoot := "https://httpbin.org/get"
    req, err := http.NewRequest("GET", apiRoot, nil)
    if err != nil {
        fmt.Println("Couldn't prepare request")
        os.Exit(1)
    }
    response, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer response.Body.Close()
    var responseStruct apiResponse
    err = json.NewDecoder(response.Body).Decode(&responseStruct)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Printf("%v\n", responseStruct)
}

运行此代码时,输​​出为:

$ go run parse.go
{{close } https://httpbin.org/get}

从输出中,我们可以看到json响应中的“ Accept”键未解码。为什么会这样呢?如何从响应正文中解析该字符串?

2 个答案:

答案 0 :(得分:1)

您的代码运行良好,但是在这里我认为您的Accept键没有从API返回,这就是为什么它不显示Accept值。要检查结构中的keyvalue对,请使用下面的print方法。

fmt.Printf("%+v\n", responseStruct)

要克服这种情况,您需要先将Accept和请求一起发送到header,然后再请求API,例如:

req.Header.Set("Accept", "value")
response, err := hc.Do(req)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

然后您将在Accept结构中获得decoded值,如下所示:

{Header:{Accept:value Close:close} URL:https://httpbin.org/get}

答案 1 :(得分:0)

apiResponse未导出-您需要将其更改为类似APIResponse的名称。您可能会发现将要解码的JSON粘贴到https://mholt.github.io/json-to-go/中就可以制作出所需的所有代码!

type AutoGenerated struct {
    Args struct {
    } `json:"args"`
    Headers struct {
        Accept                  string `json:"Accept"`
        AcceptEncoding          string `json:"Accept-Encoding"`
        AcceptLanguage          string `json:"Accept-Language"`
        Connection              string `json:"Connection"`
        Dnt                     string `json:"Dnt"`
        Host                    string `json:"Host"`
        UpgradeInsecureRequests string `json:"Upgrade-Insecure-Requests"`
        UserAgent               string `json:"User-Agent"`
    } `json:"headers"`
    Origin string `json:"origin"`
    URL    string `json:"url"`
}