Json 解析RESTAPI响应
我是刚来戈朗的。我正在编写一个程序来解析API的json响应:。我使用了以下代码来解析响应:Json 解析RESTAPI响应,json,parsing,go,Json,Parsing,Go,我是刚来戈朗的。我正在编写一个程序来解析API的json响应:。我使用了以下代码来解析响应: package main import ( "encoding/json" "fmt" "net/http" "os" ) type Headers struct { Close string `json:"Connection"` Accept string `json:"Accept"` } type apiResponse struct {
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”键没有被解码。为什么会这样?如何从响应体解析该字符串?您的代码运行良好,但我认为您的
Accept
键没有从API返回,这就是它没有显示Accept
值的原因。要检查结构的键
,值
对,请使用下面的打印
方法
fmt.Printf("%+v\n", responseStruct)
要克服这种情况,您需要在请求之前将带有请求的接受发送到标题中,如:
然后,您将在decoded
struct中获得Accept
值,如下所示:
{Header:{Accept:value Close:close} URL:https://httpbin.org/get}
apiResponse未报告-您需要将其更改为类似apiResponse的内容。您可能会发现,粘贴您想要解码的JSON将生成您需要的所有代码
类型自动生成的结构{
Args结构{
}`json:“args”`
标题结构{
Accept字符串`json:“Accept”`
AcceptEncoding字符串`json:“接受编码”`
AcceptLanguage字符串`json:“接受语言”`
连接字符串`json:“连接”`
Dnt字符串`json:“Dnt”`
主机字符串`json:“主机”`
UpgradeUnsecureRequests字符串`json:“升级不安全请求”`
UserAgent字符串`json:“用户代理”`
}`json:“标题”`
Origin字符串`json:“Origin”`
URL字符串`json:“URL”`
}
在本地运行代码时,响应不包含Accept值。@萨达姆:我已经打印了它,但它不包含Accept。它显示{Header:{Accept:Close:Close}URL:https://httpbin.org/get}
@Arun您从httpbin收到的响应不包含Accept,因为您没有发送Accept标头。发送一个,你就会得到一个。标题不是正文的一部分。它们已经被“预读”并解析为http.Repsonse.Header
@mkopriva:它不是headers,这里显示的内容来自响应的主体。您可以通过postman@Arun响应是您发送到URL的请求头的反映。您的浏览器发送的标题与Go http客户端不同。@Not_a_Golfer:我理解这种情况。我已将标题设置为与浏览器相同,并获得了结果。@Arun我的错,我误读了您的问题。我认为未报告的apiResponse不是问题,因为我是从同一文件调用它的。感谢您提供了到json to go
工具的链接。正确-json包需要导出成员才能获取它们。显示只要API返回预期的头,代码就可以正常工作。
{Header:{Accept:value Close:close} URL:https://httpbin.org/get}