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

如何在数组go-gin中拦截ReST API响应

关志
2023-03-14

我在golang项目中使用go-gin服务器,并从外部API获取一些数据,该API返回一个数组作为响应

[
  {
    "Continent": "South America",
    "Countries": [
      {
        "Country": "Argentina"
      }
    ]
  }
]

在我的golang代码中,我是这样发送请求和截取响应的

client := &http.Client{Transport: tr}
rget, _ := http.NewRequest("GET", "http://x.x.x.x/v1/geodata", nil)

resp, err := client.Do(rget)
if err != nil {
    fmt.Println(err)
    fmt.Println("Failed to send request")
}
defer resp.Body.Close()
respbody, err := ioutil.ReadAll(resp.Body)
c.Header("Content-Type", "application/json")
c.JSON(200, string(respbody))

这给出了currect响应,但我得到的不是数组,而是整个数组的字符串。所以我得到的回应是

"[{\"Continent\":\"South America\",\"Countries\": [{\"Country\": \"Argentina\"} ] } ]"

如何将响应截取为数组而不是字符串?我甚至尝试了下面的方法,它确实给了我一个数组,但却是一个空白数组。响应主体中的元素可以是数组,也可以是字符串,因此内容是混合的。

type target []string
json.NewDecoder(resp.Body).Decode(target{})
defer resp.Body.Close()
c.Header("Content-Type", "application/json")
c.JSON(200, target{})

共有1个答案

艾照
2023-03-14

您的第一个示例不起作用,因为您试图将一个字符串封送为JSON,而JSON只会对该字符串进行转义。相反,将最后一行改为

c.String(200, string(respbody))

这根本不会改变您从第三方收到的字符串,只会返回它。请参阅此处了解差异。

如果您想在数据通过程序时检查数据,您必须首先将JSON字符串解码为如下结构数组:

type Response []struct {
    Continent string `json:"Continent"`
    Countries []struct {
        Country string `json:"Country"`
    } `json:"Countries"`
}
 类似资料:
  • 我有一个API请求,它在数组中返回一个refresh_token,如下所示: 我需要访问这个refresh_token的值,并使用它来查询另一个API。 为此,我尝试首先“ReadAll”响应正文,然后通过调用“刷新令牌”访问其中的密钥。 然而,它不起作用。有没有人知道如何解决这个问题,因为我不明白? 这是我的代码:

  • 问题内容: 我看到 一吨 的条目在我的Tomcat日志(样品粘贴下面)。这些在几个月前进行次要版本升级(Spring Security 4.2.4,IIRC)后开始出现在我的日志文件中,因此,这显然是默认情况下启用的Spring新安全功能。这里报告了类似的问题,但是我的问题专门涉及如何在控制器中拦截这些异常。有一个针对此问题的Spring Security错误记录(提供一种处理RequestRej

  • 我在Tomcat日志中看到大量条目(示例粘贴在下面)。在几个月前的一次小版本升级(Spring Security 4.2.4,IIRC)后,这些功能开始出现在我的日志文件中,因此这显然是Spring中默认启用的一个新的安全特性。这里报告了一个类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常。这个问题有一个Spring Securitybug(提供一种处理RequestRejectedExc

  • 放心,当我们这样做时 抛出的错误总是连续的,也就是说,如果状态代码失败,它不会检查contentType是否是JSON。 此外,抛出的错误始终是,断言错误(预期:200,实际:404)。无法从中了解实际响应是什么,如果启用日志记录,它将打印在标准输出上,但其他任何方式都不可用。 是否有任何方法来构建或设置类似于我们如何实现<code>过滤器 我有一个 rest api 框架,其中大多数验证都是使用

  • 拦截文件 bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) bp GetPrivateProfileStringA (ini文件)

  • 拦截时间 bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数