首页 > 解决方案 > 解析 REST API 响应

问题描述

我是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”键没有被解码。为什么会这样?如何从响应正文中解析该字符串?

标签: jsonparsinggo

解决方案


您的代码运行良好,但在这里我认为您的Accept密钥没有从 API 返回,这就是它没有显示Accept价值的原因。要检查结构的key,value对,请使用以下print方法。

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

为了克服这种情况,您需要在请求API之前发送请求,Accept例如:header

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

然后你会得到struct 中的Accept值:decoded

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

推荐阅读