如何从 Go 上的请求正文中获取 JSON

2023-11-27

我是 Go 的新手,但到目前为止我非常喜欢它。

我有一个问题我无法弄清楚。我正在将 API 从 Node 迁移到 Go,并且有一个日志,我必须在其中捕获 POST 的正文AS IT IS并将其保存到jsonb在 Postgresql 数据库中键入列。

这意味着我不能使用struct或任何预定的事情。

POST 是用 body raw 制作的Content-Type: application/json像这样:

{
    "debug": false,
    "order_id_gea": 326064,
    "increment_id_gea": 200436102,
    "date": "2017-05-18T01:44:44+00:00",
    "total_amount": 10000.00,
    "currency": "MXN",
    "payment_method": "Referencia bancaria",
    "reference": "857374",
    "buyer": {
        "buyer_id_gea": 1234,
        "full_name": "Juan Perez Martinez",
        "email": "[email protected]",
        "phone": "5512341234"
    },
    "products": [
        {
            "sku":"PEP16114",
            "price": 10000.00,
            "currency": "MXN",
            "student": {
                "school_id_gea": 172,
                "grade_id_gea": 119,
                "level_id_gea": 36,
                "name": "Benancio",
                "last_name": "Perez",
                "second_last_name": "Garcia",
                "email": "[email protected]"
            }
        }
    ]
}

在 Node + Hapi 上非常简单:

const payload = request.payload

然后我可以从以下位置访问 JSONpayload.

我正在使用 Go 和 Echo,所以context是一个包装,我可以在其中找到Request() *http.Request.

我已尝试以下操作,但每次结果都是空的或因为它是空而出错:

var v interface{}
err := json.NewDecoder(context.Request().Body).Decode(&v)
if err != nil {
    return result, err
}
fmt.Println(v)

结果:EOF

--

m := echo.Map{}
if err := context.Bind(&m); err != nil {
    return result, err
}
fmt.Println(m)

结果代码 400,消息 EOF

--

body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {
    return result, error
}
fmt.Println(body)

结果 []

--

我错过了什么和/或做错了什么?谢谢!


直到那http.Response.Body是一个缓冲区,这意味着一旦被读取,就不能再被读取。

它就像一条水流,你可以在它流过时看到它并测量它,但一旦它消失了,它就消失了。

然而,知道了这一点,就有一个解决方法,你需要“抓住”身体并恢复它:

// Read the Body content
var bodyBytes []byte
if context.Request().Body != nil {
    bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}

// Restore the io.ReadCloser to its original state
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// Continue to use the Body, like Binding it to a struct:
order := new(models.GeaOrder)
error := context.Bind(order)

现在,您可以使用context.Request().Body别的地方。

Sources:

http://grokbase.com/t/gg/golang-nuts/12adq8a2ys/go-nuts-re-reading-http-response-body-or-any-reader

https://medium.com/@xoen/golang-read-from-an-io-readwriter-without-loosing-its-content-2c6911805361

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Go 上的请求正文中获取 JSON 的相关文章

随机推荐

  • 包不需要与 java 文件所在的子目录匹配吗?

    今天早上我正在为我的 java 认证编写一些练习程序 并注意到我输错了一个包名称 因此它与 java 文件所在的子目录不匹配 我编译了代码 预计会出现错误 但所有内容都编译了文件 甚至没有警告 我用谷歌搜索了一下 我读到的大多数页面都说包名
  • flutter web 的 http 请求被 Cors 策略阻止

    我有一个 Android Ios 和 Web 应用程序 使用 php 作为后端 所有 Api 在 android 和 ios 中都工作正常 但在 web 中抛出 CORS 错误 出现这样的错误 从源 http localhost 49168
  • Visual Studio 2013 安装 microsoft.net Framework 4.51 时出错

    我在安装 vs 2013 时遇到问题 下图显示了错误 我在 Google 上进行了大量研究 发现在 Windows 8 1 上 net Framework 4 5 1 现在已经成为操作系统的一部分 当 VS 2013 尝试安装 net Fr
  • 如何避免 nginx 在用作代理(proxy_pass)时用空格替换 %20 ?

    我使用 nginx 作为 apache 服务器的代理 这是我的配置 location subsite proxy pass http 127 0 0 1 subsite 1 query string 问题是 如果我发送带有 20 的请求 例
  • iPhone:通过本地通知增加应用程序徽章

    当应用程序未运行时 是否可以通过本地通知增加应用程序徽章 我知道如何设置徽章 但还没有找到任何方法来增加这个值 localNotification applicationIconBadgeNumber 23 Update 我找到了一个 远非
  • Oracle SQL 获取第 n 个元素正则表达式

    我正在尝试使用 Oracle 中的 SQL 获取逗号分隔字符串中的第 n 个元素 到目前为止我有以下 SELECT regexp substr 100016154 5101884LT00001 10000001089210000001265
  • WCF 自定义 Http 代理身份验证

    是否可以为 WCF 提供自定义代理地址和自定义凭据 我在 stackoverflow 上找到了这个答案 如何使用生成的 WCF 客户端的凭据设置代理 但我遇到了一个复杂的问题 我要进行身份验证的服务使用自己的身份验证 因此我必须使用两组凭据
  • Azure Ad b2c:通过邀请添加新成员用户

    我有一个Azure 广告 B2C在 Azure 上运行 我想在 B2C 中创建带有邀请的用户 我尝试创建来宾用户 但该用户无法登录 因为该用户是作为 B2B 用户创建的 我也尝试过手动添加用户 但我无法添加自己的域 例如 电子邮件受保护 但
  • Json.net 反序列化具有非字符串键类型的嵌套字典

    我正在使用 Json NET 反序列化一个对象 其中包含具有自定义 非字符串 键类型的嵌套字典 这是我正在尝试做的事情的示例 public interface IInterface String Name get set public cl
  • javascript - 比较不同格式的日期

    我有两个日期 我需要比较它们 看看其中一个是否大于另一个 但它们的格式不同 我不确定比较两个日期的最佳方法 格式为 1381308375118 这是 var futureDate 这是由创建的 var today new Date toda
  • 如何从自定义按钮调用数据表 csv 按钮

    需要从我的自定义按钮调用 csv 按钮
  • 网络音频启动和停止振荡器然后再次启动

    我正在尝试启动和停止声音 那行得通 但我无法再次启动声音 我真的需要再次制作另一个振荡器吗 这看起来非常不直观 一定会有更好的办法 这就是我所拥有的一切 oscillator1 noteOn 0 oscillator1 noteOff 0
  • PHPSESSID 未保存到 cookie

    保存会话 ID 的 PHPSESSID 变量未保存到客户端 cookie 中 这会导致每次我调用时都会生成一个新的会话 IDsession start 功能 当我使用 FireFox Opera 和 Chrome 时 情况就是如此 对于 s
  • 将JSON数据插入到android中的SQLite数据库中

    我想将 JSON 数组中的数据插入到 SQLite 数据库中 我创建了两个类 CategoryHelper java 和 AndroidJSONParsingActivity java 来获取 java 响应 当我运行代码时出现异常data
  • 如何将 boost::serialize 转换为 sqlite::blob?

    我正在从事一个科学项目 需要多种程序能力 在寻找可用的工具后 我决定使用 Boost 库 它为我提供了 C 标准库未提供的所需功能 例如日期 时间管理等 我的项目是一组命令行 它处理来自旧的 自制的 基于纯文本文件的数据库的大量数据 导入
  • 3d numpy 数组的众数/中值/平均值

    我有一个 3d numpy 数组 我的目标是获取它的平均值 众数 中位数 它的形状为 500 300 3 我想得到例如 430 232 22 作为模式 有没有办法做到这一点 标准 np mean array 给了我一个非常大的数组 我不知道
  • Java 监听器必须继承自 java.util.EventListener - 为什么?

    在javadoc中它说EventListener是 所有事件侦听器接口都必须扩展的标记接口 这是为什么 让自定义监听器实现EventListener有什么意义 是否有对 EventListener 进行特殊处理的地方 可能被使用过javab
  • PHP 可调用对象作为对象成员

    我有课Logger其中 除其他外 还有一个方法Log As Log最常见的用途是Logger例如 我已经有线 invoke打电话Log 另一个类 Site 包含一个成员 Log 它是 Logger 的一个实例 为什么这会起作用 Log th
  • 如何在 jquery 插件中对私有方法进行单元测试?

    也许这是一个有点新手的 JQuery 问题 但是 正确的 jquery 插件是写在闭包内的 因此只有定义插件接口的方法才能从外部访问 有时 或很多时候 人们可能需要辅助方法 而将其作为插件接口的一部分公开是没有意义的 例如 因为它们会改变内
  • 如何从 Go 上的请求正文中获取 JSON

    我是 Go 的新手 但到目前为止我非常喜欢它 我有一个问题我无法弄清楚 我正在将 API 从 Node 迁移到 Go 并且有一个日志 我必须在其中捕获 POST 的正文AS IT IS并将其保存到jsonb在 Postgresql 数据库中