当前位置: 首页 > 知识库问答 >
问题:

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

於乐语
2023-03-14

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

我正试着在这个应用程序中做这件事。Ip_response_success结构是根据http://ip-api.com/docs/api:json的api文档创建的

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没有提到任何身份验证要求或用户代理要求,事实上,当我卷曲它或通过浏览器访问它时,它似乎不需要任何特殊的东西。在我的程序中,我做错了什么,还是我用错了API?

我尝试在代码中打印响应,但 resp.body 只是显示为空白。打印 http 的示例响应。响应结构 :

&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个答案

解河
2023-03-14

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

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

 类似资料:
  • 诸葛io除了提供了非常灵活的可视化分析界面外,还提供了强大、完善的查询API。 查询API包括以下四类: 数据统计API 用户查询API 用户行为轨迹API 用户群查询API 一、概述 诸葛io查询API是基于RESTful、超媒体的JSON web服务。在设计的每一步都强调了灵活性和标准遵从性,因此使用它是一件简单的事情。 二、协议 查询API的根URL是 https://api.zhugeio

  • 本节介绍ORM的API参考 Query 对象。有关如何使用此对象的演练,请参见 对象关系教程(1.x API) . 查询对象 Query 是根据给定的 Session ,使用 Session.query() 方法: q = session.query(SomeMappedClass) 下面是 Query 对象。 Object Name Description Query ORM级SQL构造对象。

  • 我尝试使用AlmoFire向web服务发布设备令牌和设备详细信息。但我得到了如下的回应 UserInfo={nsUnderlyingError=0x7FBA3A590E50{Error domain=KCFerrordomainCFNetwork code=-1022“(null)”},nserrorFailingURLStringKey=http://---/Register,nserrorFa

  • 我有一个用Java编写的Spring Boot应用程序,它是一个REST API。该服务(Svc A)调用REST API服务(Svc B),该服务也是用Java编写的Spring Boot应用程序。当没有找到数据时,Svc B返回404状态码。我需要将此响应更改为200状态代码,并返回一个空响应对象。我不确定是否或如何做到这一点。 我可以捕捉错误,并确定404是否是这个没有数据发现的错误。但是,

  • 这是我的代码,我试图通过它发送请求http://localhost:3000/api/post/article使用邮递员,但我收到无法获取的错误。它不用路由器就可以工作。获取,但使用应用程序。所以我认为问题出在路由器上。 这是server.js文件 这是应用程序文件 这是路由器文件 这是控制器文件

  • 我正在为一个项目设计openAPI规范。该项目是一个REST API,提供有关酒店的信息。 如果,响应应该如下所示: 我不希望有一个涵盖这两种响应的规范,因为我希望基于其URL参数验证任何给定的响应(例如,时不应该是字段)。到目前为止,我还没能找到一种基于查询参数在openAPI中指定不同返回行为的方法。 是否有一种基于查询参数指定行为的方法?或者,我是否应该将APIendpoint更改为?