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

我正在尝试使用http://ip-api.com/ api 通过我的 IP 地址获取经度和纬度。当我从浏览器或使用http://ip-api.com/jsoncurl访问时,它会在 json 中返回正确的信息。但是当我尝试从我的程序中使用 API 时,API 响应的主体是空的(或者看起来如此)。


我试图在这个应用程序中做到这一点。Ip_response_success 结构是根据此处的 api 文档制作的http://ip-api.com/docs/api:json


type 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)}

任何帮助,将不胜感激!


小怪兽爱吃肉
浏览 173回答 1
1回答

慕娘9325324

首先,您必须阅读正文,然后对其进行解析: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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go