首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gin-gonic将request.body值映射为结构

gin-gonic将request.body值映射为结构
EN

Stack Overflow用户
提问于 2017-12-16 09:16:18
回答 2查看 8.9K关注 0票数 1

我是围棋编程语言的新手。我正在构建一个使用gin-gonic框架的web服务器。我试图将req.body的值映射到结构上。

使用邮递员,我在x-www-form-urlencoded下面发送一个带有以下键/保险库的邮件请求

角色:管理

用户名:管理员用户名

id: 1

我的go代码如下所示

代码语言:javascript
运行
复制
package jwtsecuritytoken

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

type requestBody struct {
    role      string
    username  string    
    id        string
}

func GenerateToken(c *gin.Context) {
    fmt.Println(c.PostForm("role"))
    var reqBody requestBody
    err := c.Bind(reqBody)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(reqBody)
    content := gin.H{"Hello": "World"}
    c.JSON(200, content)
   }

我能够从c.PostForm("name")读取值,但当我试图将其绑定到结构时,会得到以下错误

代码语言:javascript
运行
复制
reflect: Elem of invalid type
C:/Go/src/runtime/panic.go:491 (0x42bf80)
    gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
 C:/Go/src/reflect/type.go:955 (0x4bdb19)
    (*rtype).Elem: panic("reflect: Elem of invalid type")
   C:/Learnings/Go/src/github.com/gin-gonic/gin/binding/form_mapping.go:15     (0x8b6b5a)
    mapForm: typ := reflect.TypeOf(ptr).Elem()
     C:/Learnings/Go/src/github.com/gin-gonic/gin/binding/form.go:24    
    formBinding.Bind: if err := mapForm(obj, req.Form); err != nil {
  <autogenerated>:1 (0x8b9298)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:508 (0x8f3319)
    (*Context).ShouldBindWith: return b.Bind(c.Request, obj)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:475 (0x8f2e3d)
    (*Context).MustBindWith: if err = c.ShouldBindWith(obj, b); err != nil {
    C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:458 (0x8f2a7d)
    (*Context).Bind: return c.MustBindWith(obj, b)
    C:/Learnings/Go/src/AuthenticateService/jwtsecuritytoken/jwtsecuritytoken.go:22 (0x905c23)
    GenerateToken: err := c.Bind(reqBody)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:107 (0x8f10b9)
    (*Context).Next: c.handlers[c.index](c)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/recovery.go:46 (0x9038f0)
    RecoveryWithWriter.func1: c.Next()
  C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:107 (0x8f10b9)
    (*Context).Next: c.handlers[c.index](c)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/logger.go:83 (0x902c12)
    LoggerWithWriter.func1: c.Next()
  C:/Learnings/Go/src/github.com/gin-gonic/gin/context.go:107 (0x8f10b9)
    (*Context).Next: c.handlers[c.index](c)
  C:/Learnings/Go/src/github.com/gin-gonic/gin/gin.go:352 (0x8fa52c)
    (*Engine).handleHTTPRequest: c.Next()
  C:/Learnings/Go/src/github.com/gin-gonic/gin/gin.go:319 (0x8f9cb1)
    (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
  C:/Go/src/net/http/server.go:2619 (0x66b69a)
     serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
  C:/Go/src/net/http/server.go:1801 (0x6676c3)
    (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
   C:/Go/src/runtime/asm_amd64.s:2337 (0x457e70)
    goexit: BYTE    $0x90   // NOP
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-16 10:24:23

我想,而不是

代码语言:javascript
运行
复制
var reqBody requestBody
err := c.Bind(reqBody)

可能是

代码语言:javascript
运行
复制
reqBody := new(requestBody)
err := c.Bind(reqBody)

第二个代码创建一个指向requestBody的指针,因此绑定可以应用于指针。如果传递一个值,它可以绑定,但不会得到结果。所以它是无效的类型。更具体地说,在mapForm: typ := reflect.TypeOf(ptr).Elem(),它采用类型,假设它是指向某物的指针(Elem())。当您传入值Elem()恐慌时,请参阅https://golang.org/pkg/reflect/#Value.Elem

为什么是new()而不是var reqBody *requestBodynew将创建一个新的对象来绑定值。在第二种情况下声明指针将创建一个不可绑定的nil指针。

您还可以编写reqBody := &requestBody{},这与new语法相同。

票数 2
EN

Stack Overflow用户

发布于 2021-10-31 19:14:17

我知道这是三年前的事,但万一有人发现了.

我们可以更容易地获取第一段代码,只需使用指向变量的指针,而不是创建带有指针类型的变量。

代码语言:javascript
运行
复制
var reqBody requestBody
err := c.Bind(&reqBody)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47844182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档