登录
首页 >  Golang >  Go问答

gin/golang - 空请求正文

来源:Golang技术栈

时间:2023-03-21 12:39:20 336浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《gin/golang - 空请求正文》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我是 Go 和 Gin 的新手,无法打印出完整的请求正文。

我希望能够从第三方 POST 读取请求正文,但我得到的是空的请求正文

curl -u dumbuser:dumbuserpassword -H "Content-Type: application/json" -X POST --data '{"events": "3"}' http://localhost:8080/events

我的整个代码如下。任何指针表示赞赏!

package main

import (
  "net/http"
  "fmt"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  authorized := router.Group("/", gin.BasicAuth(gin.Accounts{
     "dumbuser": "dumbuserpassword",
  }))
  authorized.POST("/events", events)
  router.Run(":8080")
}

func events(c *gin.Context) {
  fmt.Printf("%s", c.Request.Body)
  c.JSON(http.StatusOK, c)
}

正确答案

这里的问题是您正在打印出c.Request.Body接口类型的字符串值ReadCloser

您可以做的就是让自己确信它确实包含您想要的主体,就是从c.Request.Body字符串中读取值,然后将其打印出来。 这仅适用于您的学习过程!

学习代码:

func events(c *gin.Context) {
        x, _ := ioutil.ReadAll(c.Request.Body)
        fmt.Printf("%s", string(x))
        c.JSON(http.StatusOK, c)
}

但是,这不是您访问请求正文的方式。让 gin 使用绑定为您解析正文。

更正确的代码:

type E struct {
        Events string
}

func events(c *gin.Context) {
        data := &E{}
        c.Bind(data)
        fmt.Println(data)
        c.JSON(http.StatusOK, c)
}

这是访问正文中数据的更正确的方法,因为它已经为您解析出来了。请注意,如果您首先阅读正文,就像我们在上面的学习步骤中所做的那样,c.Request.Body遗嘱已被清空,因此正文中将没有任何内容可供 Gin 阅读。

损坏的代码:

func events(c *gin.Context) {
    x, _ := ioutil.ReadAll(c.Request.Body)
    fmt.Printf("%s", string(x))
    data := &E{}
    c.Bind(data) // data is left unchanged because c.Request.Body has been used up.
    fmt.Println(data)
    c.JSON(http.StatusOK, c)
}

您可能还好奇为什么从这个端点返回的 JSON 显示为空Request.Body。这是出于同样的原因。JSON Marshalling 方法无法序列化 a ReadCloser,因此它显示为空。

理论要掌握,实操不能落!以上关于《gin/golang - 空请求正文》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>