gpt4 book ai didi

go - 如何从 Gin 的前端获取数据?

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:15 26 4
gpt4 key购买 nike

令我遗憾的是,我一直无法弄清楚如何在 Gin 框架中从前端获取数据。在 Django 中我得到数据所以:

user=request.data.get('user')
print(user)

一切都像白天一样简单易懂。我应该如何在 Gin 中做到这一点?

user := c.Query("user")
user := c.Param("user")
user := c.Params.ByName("user")
user := c.PostForm("user")
println(user)//emptiness....

最佳答案

好吧,我想说你应该拿一些关于 HTTP 如何工作的书/HOWTO 并花一些时间研究它,因为看起来你试图解决手头的问题而没有真正理解你的浏览器和你的后端之间发生了什么服务。

这里真正的问题是你似乎意识到了更多的移动部分,而要走的路取决于你的前端做什么。

您没有确切地告诉我们您是如何执行您的请求的,但是从征求的评论来看,您正在使用那个“axios”小东西。如果我设法正确地用谷歌搜索那个项目,它的自述文件 states :

By default, axios serializes JavaScript objects to JSON. To send data in the application/x-www-form-urlencoded format instead, you can use one of the following options.

这意味着两件事:

  1. 除非你以某种方式调整了 axios 的设置,否则axios.post,应该执行 HTTP POST 请求其 Content-Type 字段设置为 application/json及其有效载荷(或“主体”,如果您愿意)是{user:this.user} JavaScript 对象的 JSON 序列化。
  2. 因此,尝试解析查询字符串是徒劳的。尝试将请求解析为 HTTP 形式是徒劳的——事实并非如此。

相反,您可能希望将传入请求的正文解释为 JSON 格式。我不知道如何在“go-gin”中做到这一点,但在普通的 Go 中会是这样的

func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
defer req.Body.Close()

var user User

dec := json.NewDecoder(req.Body)
err := dec.Decode(&user)
if err != nil {
rw.Header().Set("Content-Type", "text/plain; charset=UTF-8")
rw.WriteHeader(http.StatusBadRequest)
fmt.Fprintln(rw, "Error parsing request body: ", err)
return
}
}

理想情况下,您首先检查传入请求的内容类型是否确实是 application/json,如果不是,则立即使用 http.StatusBadRequest 拒绝它'

一个工作代码的例子是

// VerifyContentTypeIsJSON makes sure the HTTP header of a server
// http.Request contains the Content-Type field and it indicates
// the request payload is JSON.
// The implementation is based on RFC 7231 (section 3.1.1.5) and RFC 8259.
func VerifyContentTypeIsJSON(header http.Header) error {
var s string

if values := header["Content-Type"]; len(values) > 0 {
s = values[0]
} else {
return errors.New("missing Content-Type")
}

if s == "" {
return errors.New("empty Content-Type")
}

if i := strings.IndexByte(s, ';'); i != -1 {
s = strings.TrimSpace(s[:i])
}

if strings.ToLower(s) != "application/json" {
return fmt.Errorf("unknown Content-Type: %v, must be application/json", s)
}

return nil
}

有了这个函数,你就会有这样的东西在 defer req.Body.Close() 并实际解析它之后:

if err := VerifyContentTypeIsJSON(req.Header); err != nil {
rw.Header().Set("Content-Type", "text/plain; charset=utf-8")
rw.WriteHeader(http.StatusBadRequest)
fmt.Fprintln(rw, err)
return
}

(请注意,“go-gin”可能已经内置了与此类似的东西,所以请检查一下。)

User 类型应该是一些 struct 类型,与您打算从请求中解码的 JSON 对象的形状相匹配。像这样:

type User struct {
User string `json:"user"`
}

没有,我的例子在两个地方返回了一个用户错误,它使用了纯文本的内容类型(采用 UTF-8 编码)。这可能没问题,但也可能不是。比如,您的客户可能希望得到 JSON 格式的文档一些商定的形状。

或者您可以使用 content negotiation ,但我建议先把简单的事情弄清楚。


要检查的文献:


也许可以回答你的那部分问题为什么它在 Django 中“有效”。我只能猜测,但我认为它只是实现了大量魔法,这些魔法会查看传入的请求并尝试猜测如何从中提取数据。

问题是猜测可能确实适用于一次性脚本,但是当你要实现类似 web API 的东西时(很多人不太正确地称之为“REST”,但我们不要离题)它是最好的非常明确地说明您的端点接受什么准确地以及他们如何准确地对请求使用react——合法的和格式不正确的。

关于Go中的魔法,你可以阅读this .

关于go - 如何从 Gin 的前端获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240259/

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