当前位置: 首页 > 面试题库 >

杜松子酒/ golang-空需求体

夹谷沛
2023-03-14
问题内容

我是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)
}

但是,这不是您应该访问请求正文的方式。让杜松子酒通过使用绑定为您解析正文。

更正确的代码:

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编组方法无法序列化ReadCloser,因此显示为空。



 类似资料:
  • 问题内容: 我在Gin中设置了默认路由器和一些路由: 但是我该如何处理杜松子酒中找不到404路线? 最初,我使用的是了解Gin所用的httprouter,所以这就是我最初拥有的… 和功能: 但这对杜松子酒不起作用。 我需要能够使用返回JSON,这样我才能使用: 问题答案: 您正在寻找的是处理程序。 更确切地说:

  • 问题内容: 如何在Gin Gonic Web Golang框架中将代理路由的一些路径反向请求到另一个后端 是否有一种方法可以直接在Handle函数中进行转发,如下所示? 问题答案: 您可以使用标准库httputil.ReverseProxy进行此操作。 我还没有找到自己使用gin的理由,所以我尽可能地坚持使用stdlib。但是我相信您可以包装此ReverseProxy处理程序,以便能够与您的gin

  • 问题内容: 我需要将响应主体记录在gin的中间件中,但是我找不到如何获取响应主体。有人可以帮忙吗? 我正在使用这样的中间件: 我的问题是,如何从中间件中的Context获取响应主体? 问题答案: 您需要拦截响应的编写并将其首先存储在某处。然后您可以记录它。为此,您需要实现自己的Writer来拦截Write()调用。 例如,如下: 然后像这样使用这个中间件: 请注意,该基石不适用于静态文件,因为gi

  • 松鼠ai golang实习面试 8.20 全程1h10min 1. 自我介绍 问基本情况,学习go多长时间等等 2.gmp模型 2.1.gmp模型调度顺序 2.2.m和p的关系 3.go语言中的gc 3.1.gc三色标记和存活对象颜色 3.2.gc出现的写屏障 4.new和make的区别 5.slice底层原理,如何从slice中删除数据 5.1.make一个len为0的切片,获取数据有没有问题

  • 56 min 问了实习为啥不干了(我回答:我还年轻,想看看世界) golang : 1、= 和 := 有什么区别? 2、go 允许有多个返回值吗? 3、go 里有异常类型吗? 4、error 怎么去做这个异常呢? 5、go 用三种以上方法拼接字符串,哪一种性能更好(这题我之前不知道在哪看过原理,但是后来忘了,哭...) 6、map 有什么特性 7、map 是否包含某个key ( _, ok :=

  • 问题内容: 我正在尝试将JSON参数发送到我的服务器,并使用json.Decoder解析它们。我读到您应该能够从request.Body属性获取查询参数。以下是我的服务器代码: 每次,我都会看到(当然是不同的时间戳记)。我的客户端AJAX调用如下: 发送内容的示例URL: 更好看一下参数: 我已经尝试了GET和POST请求。 为什么我的req.Body从不解码?如果我尝试单独打印req.Body,