我正在尝试使用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)}
任何帮助,将不胜感激!
慕娘9325324
相关分类