gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:03 26 4
gpt4 key购买 nike

我正在尝试使用 http://ip-api.com/ api通过我的ip地址获取经度和纬度。当我访问 http://ip-api.com/json从我的浏览器或使用 curl,它以 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)}

如有任何帮助,我们将不胜感激!

最佳答案

首先,你必须读取正文,然后解析它:

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

关于api - 尝试查询 API,但 api 响应为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37937407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com