为了账号安全,请及时绑定邮箱和手机立即绑定

尝试查询 API,但 api 响应为空白

尝试查询 API,但 api 响应为空白

Go
小怪兽爱吃肉 2022-01-17 19:59:05
我正在尝试使用http://ip-api.com/ api 通过我的 IP 地址获取经度和纬度。当我从浏览器或使用http://ip-api.com/jsoncurl访问时,它会在 json 中返回正确的信息。但是当我尝试从我的程序中使用 API 时,API 响应的主体是空的(或者看起来如此)。我试图在这个应用程序中做到这一点。Ip_response_success 结构是根据此处的 api 文档制作的http://ip-api.com/docs/api:jsontype Ip_response_success struct {    as          string    city        string    country     string    countryCode string    isp         string    lat         string    lon         string    org         string    query       string    region      string    regionName  string    status      string      timezone    string    zip         string}func Query(url string) (Ip_response_success, error) {    resp, err := http.Get(url)    if err != nil {        return Ip_response_success{}, err    }    fmt.Printf("%#v\n", resp)    var ip_response Ip_response_success    defer resp.Body.Close()    err = json.NewDecoder(resp.Body).Decode(&ip_response)    if err != nil {        return Ip_response_success{}, err    }    body, err := ioutil.ReadAll(resp.Body)    fmt.Printf("%#v\n", string(body))    return ip_response, nil}func main() {    ip, err := Query("http://ip-api.com/json")    if err != nil {        fmt.Printf("%#v\n", err)    }}但最奇怪的是响应的正文是空白的。它在响应中给出了 200 状态码,所以我假设 API 调用没有错误。该 API 没有提及任何身份验证要求或用户代理要求,实际上,当我 curl 或通过浏览器访问它时,它似乎不需要任何特殊的东西。我在我的程序中做错了什么还是我使用了错误的 API?我尝试在代码中打印响应,但resp.body只是显示为空白。打印结构的示例响应http.Response:&http.Response{Status:"200 OK", StatusCode:200, Proto:"HTTP/1.1", ProtoMajor:1, ProtoMinor:1, Header:http.Header{"Access-Control-Allow-Origin":[]string{"*"}, "Content-Type":[]string{"application/json; charset=utf-8"}, "Date":[]string{"Tue, 21 Jun 2016 06:46:57 GMT"}, "Content-Length":[]string{"340"}}, Body:(*http.bodyEOFSignal)(0xc820010640), ContentLength:340, TransferEncoding:[]string(nil), Close:false, Trailer:http.Header(nil), Request:(*http.Request)(0xc8200c6000), TLS:(*tls.ConnectionState)(nil)}任何帮助,将不胜感激!
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

首先,您必须阅读正文,然后对其进行解析:


body, err := ioutil.ReadAll(resp.Body)

err = json.NewDecoder(body).Decode(&ip_response)

if err != nil {

    return Ip_response_success{}, err

}

另外,在 go 中,json 解码器必须能够访问结构的字段。这意味着它们必须暴露在您的包裹之外。


这意味着您使用 json 注释来指定映射:


type Ip_response_success struct {

    As          string `json: "as"`

    City        string `json: "city"`

    Country     string `json: "country"`

    CountryCode string `json: "countryCode"`

    Isp         string `json: "isp"`

    Lat         float64 `json: "lat"`

    Lon         float64 `json: "lon"`

    Org         string `json: "org"`

    Query       string `json: "query"`

    Region      string `json: "region"`

    RegionName  string `json: "regionName"`

    Status      string `json: "status"`

    Timezone    string `json: "timezone"`

    Zip         string `json: "zip"`

}

另请注意,我根据服务器发送的数据将 Lon / Lat 类型更改为 float64


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信