gpt4 book ai didi

go - JSON响应附加到HTML模板输出

转载 作者:行者123 更新时间:2023-12-01 22:27:32 24 4
gpt4 key购买 nike

我有这种怪异的行为,我认为是由于使用相互冲突的基础架构引起的:

  • Traefik用于反向代理
  • 内部库SM,它将所有请求包装到我们的后端语言中;它从请求中解析JSON,并为响应
  • 返回某个JSON结构
  • 对于Traefik,我必须返回HTML页面而不是JSON。

  • 我使用Go for BE并为FE渲染HTML模板

    我的流程看起来像这样:
    func (r RestrictedHandler) Exec(c *smContext) (interface{}, ServiceError) {
    // check if we have a cookie for auth
    if tokenCookie, err := tokens.GetTokenFromCookie(c); err != nil {
    c.HTML(401, "login.html")
    return "", err
    } else {
    return r, nil
    }
    }

    和包装为此:
        if response, err := newH1.Exec(hc); err != nil {
    c.JSON(err.GetStatusCode(), gin.H{
    "status": "error",
    "error": err
    })
    } else {
    c.JSON(http.StatusOK, gin.H{
    "status": "success",
    "data": response
    })
    }

    因此,这里发生的事情(我怀疑)是我“推送”到HTML文本和JSON文本的响应“缓冲区”,从而导致用户得到以下html页面:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    My returned page
    </body>
    </html>{"status":"error","error":{"msg":"Unauthorized error","type":"Unauthorized"}}

    所以我的问题是,如何在 c.HTML()之后停止写到上下文中?
  • 我尝试了c.Next()和c.Abort(),但我想它们更多是用于链接中间件。
  • 更改SM库代码(与我一起工作的人共享的代码,但仍然可以提交拉取请求),以某种方式检查“如果响应中包含html标记,请不要执行c.JSON()”。
  • 最佳答案

    因此,我与负责我们的SM库的那个人进行了交谈。我们向上下文对象添加了一个标记,称为“responseOverridden”。任何引用上下文对象的人都可以设置标志(在他自己的服务中),然后在SM库中,如果设置了此标志,我们就不会返回JSON:

    // someService.go
    func (r RestrictedHandler) Exec(c *smContext) (interface{}, ServiceError) {
    // check if we have a cookie for auth
    if tokenCookie, err := tokens.GetTokenFromCookie(c); err != nil {
    c.HTML(401, "login.html")
    c.replyOverriden = true
    return "", err
    } else {
    return r, nil
    }

    }

    在库代码中:
     // SM.go
    response, err := newH1.Exec(hc);
    if !hc.responseOverridden {
    err != nil {
    c.JSON(err.GetStatusCode(), gin.H{
    "status": "error",
    "error": err
    })
    } else {
    c.JSON(http.StatusOK, gin.H{
    "status": "success",
    "data": response
    })
    }
    }
    // someone probably handled something in hc, so don't return JSON

    关于go - JSON响应附加到HTML模板输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59027349/

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