草庐IT

go - gin-gonic 将 request.body 值映射到结构中

coder 2024-07-07 原文

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

我使用 Postman 在 x-www-form-urlencoded 下发送带有以下键/值的 POST 请求

角色:管理员

用户名:管理员用户名

编号:1

我的go代码如下

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") 读取值 但是当我尝试将它绑定(bind)到结构时,出现以下错误

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

最佳答案

我猜,而不是

var reqBody requestBody
err := c.Bind(reqBody)

可能是

reqBody := new(requestBody)
err := c.Bind(reqBody)

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

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

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

关于go - gin-gonic 将 request.body 值映射到结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47844182/

有关go - gin-gonic 将 request.body 值映射到结构中的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  5. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  6. ruby - Controller 中的 request.cookies 和 cookies 有什么区别? - 2

    request.cookies和RubyonRails中的cookies对象有区别吗?我目前正在尝试将带有cookie的请求从我的node.js服务器发送到我的ROR4应用程序。似乎在ROR应用程序中,request.cookies包含我发送的cookie,但是cookies对象(现有逻辑所基于的对象)没有它。我已经搜索了文档,但找不到任何相关内容。我错过了什么吗?感谢您的帮助。 最佳答案 理想情况下,request.cookies和cookies应该相同。但是,在POST(创建操作)请求中,rails会验证XSRFtoken。如果

  7. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  8. ruby-on-rails - "undefined method ` stub_request '"访问 RSpec 支持文件中的方法时 - 2

    我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re

  9. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  10. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

随机推荐