【发布时间】:2018-10-09 13:25:03
【问题描述】:
我是 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”键没有被解码。为什么会这样?如何从响应正文中解析该字符串?
【问题讨论】:
-
标题不是正文的一部分。它们已经“预读”并解析为
http.Repsonse.Header。 -
@mkopriva:不是标题,这里显示的内容来自响应的正文。您可以通过邮递员进行测试
-
@Arun 响应反映了您发送 URL 的请求标头。您的浏览器发送的标头与 Go http 客户端不同。
-
@Not_a_Golfer:我了解情况。我已经设置了和浏览器一样的标题,我得到了结果。
-
@Arun 我的错,我看错了你的问题。