我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Gin框架中bind怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Gin框架中bind怎么使用

本篇内容主要讲解“Gin框架中bind怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Gin框架中bind怎么使用”吧!

    概述

    Gin框架中,有bind函数可以非常方便的将url的查询参数query parameter、http的Header,body中提交上来的数据格式,如form,json,xml等,绑定到go中的结构体中去,这期间Binding做了啥事情,这么多个Bindding函数,我们该如何选择,一起通过源码来解开其中神秘的面纱吧。

    Binding接口

    type Binding interface {   Name() string   Bind(*http.Request, interface{}) error}

    Binding是一个接口,在源码中,有10个实现了Binding的结构体,以及3个接口

    Gin框架中bind怎么使用 

    context.Bind

    // Bind checks the Content-Type to select a binding engine automatically,// Depending the "Content-Type" header different bindings are used://     "application/json" --> JSON binding//     "application/xml"  --> XML binding// otherwise --> returns an error.// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input.// It decodes the json payload into the struct specified as a pointer.// It writes a 400 error and sets Content-Type header "text/plain" in the response if input is not valid.func (c *Context) Bind(obj interface{}) error {b := binding.Default(c.Request.Method, c.ContentType())return c.MustBindWith(obj, b)}

    cnotext.MustBindWith

    // MustBindWith binds the passed struct pointer using the specified binding engine.// It will abort the request with HTTP 400 if any error occurs.// See the binding package.func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error {   if err := c.ShouldBindWith(obj, b); err != nil {      c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck      return err   }   return nil}

    从注解和源码可以看出,MustBindWith最终也是调用了SouldBindWith,并且对ShouldBindWith的结果进行了判断,如果有错误,则以http 400的状态码进行退出。

    ShouldBindWith

    // ShouldBindWith binds the passed struct pointer using the specified binding engine.// See the binding package.func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error {   return b.Bind(c.Request, obj)}

    这个方法是所有其他绑定方法的一个基础,基本上所有的绑定方法都需要用到这个方法来对数据结构进行一个绑定

    以上为主要的bingding的过程,其他派生出来的如BindJSON、ShouldBindJSON等,为具体的数据类型的快捷方式而已,只是帮我们把具体的bingding的数据类型提前给封装了起来而已,如Json格式的bingding函数

    context.BindJSON

    // BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON).func (c *Context) BindJSON(obj interface{}) error {   return c.MustBindWith(obj, binding.JSON)}

    context.BindJSON从源码上分析,可以看到,仅仅比Bind方法少了一句

    b := binding.Default(c.Request.Method, c.ContentType())

    这一句是为了判断当前的请求方法和contentType,来给context.MustBindWith传的一个具体的bingding类型。

    Json的实现的Binding接口如下

    func (jsonBinding) Bind(req *http.Request, obj interface{}) error {   if req == nil || req.Body == nil {      return fmt.Errorf("invalid request")   }   return decodeJSON(req.Body, obj)}

    jsonBinding结构体实现了Binding接口的Bind方法,将请求过来的Body数据进行解码,绑定到obj里面去

    context.ShouldBindJSON

    // ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON).func (c *Context) ShouldBindJSON(obj interface{}) error {   return c.ShouldBindWith(obj, binding.JSON)}

    从源码的注解来看,ShouldBindJSON其实就是ShouldBindWith(obj, binding.JSON)的快捷方式,简单来说,就是在ShouldBindWith(obj, binding.JSON)上面固定了参数,当我们明确规定,body提交的参数内容为json时,简化了我们的调用和增强了代码的可读性。

    context.ShouldBindUri()

    // ShouldBindUri binds the passed struct pointer using the specified binding engine.func (c *Context) ShouldBindUri(obj interface{}) error {   m := make(map[string][]string)   for _, v := range c.Params {      m[v.Key] = []string{v.Value}   }   return binding.Uri.BindUri(m, obj)}

    从url绑定采用的方法跟header和body的方式不一样,不需要传入一个实现Binding接口的结构体类型

    context.ShouldBindUri()

    // BindUri binds the passed struct pointer using binding.Uri.// It will abort the request with HTTP 400 if any error occurs.func (c *Context) BindUri(obj interface{}) error {   if err := c.ShouldBindUri(obj); err != nil {      c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck      return err   }   return nil}

    BindUri也是对ShouldBindUri的一个封装,多了一个对ShouldBindUri结果的一个判断 代码实例

    代码如下

    package mainimport ("github.com/gin-gonic/gin""net/http")type queryHeader struct {Myheader string `header:"myheader"`Mydemo string `header:"mydemo"`}type queryBody struct {Name string `json:"name"`Age int `json:"age"`Sex int `json:"sex"`}type queryParameter struct {Year int `form:"year"`Month int `form:"month"`}type queryUri struct {Id int `uri:"id"`Name string `uri:"name"`}func bindUri(context *gin.Context){var q queryUrierr:= context.ShouldBindUri(&q)if err != nil {context.JSON(http.StatusBadRequest,gin.H{"result":err.Error(),})return}context.JSON(http.StatusOK,gin.H{"result":"绑定成功","uri": q,})}func bindQuery(context *gin.Context){var q queryParametererr:= context.ShouldBindQuery(&q)if err != nil {context.JSON(http.StatusBadRequest,gin.H{"result":err.Error(),})return}context.JSON(http.StatusOK,gin.H{"result":"绑定成功","query": q,})}func bindBody(context *gin.Context){var q queryBodyerr:= context.ShouldBindJSON(&q)if err != nil {context.JSON(http.StatusBadRequest,gin.H{"result":err.Error(),})return}context.JSON(http.StatusOK,gin.H{"result":"绑定成功","body": q,})}func bindhead(context *gin.Context){var q queryHeadererr := context.ShouldBindHeader(&q)if err != nil {context.JSON(http.StatusBadRequest,gin.H{"result":err.Error(),})return}context.JSON(http.StatusOK,gin.H{"result":"绑定成功","header": q,})}func main(){srv := gin.Default()srv.GET("/binding/header",bindhead)srv.GET("/binding/body",bindBody)srv.GET("/binding/query",bindQuery)srv.GET("/binding/:id/:name",bindUri)srv.Run(":9999")}

    运行结果

    绑定Header数据

    Gin框架中bind怎么使用

    绑定QueryParameter数据

    Gin框架中bind怎么使用

    绑定Body Json数据

    Gin框架中bind怎么使用

    绑定Uri数据

    Gin框架中bind怎么使用

    到此,相信大家对“Gin框架中bind怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Gin框架中bind怎么使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Gin框架中bind怎么使用

    本篇内容主要讲解“Gin框架中bind怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Gin框架中bind怎么使用”吧!概述Gin框架中,有bind函数可以非常方便的将url的查询参数qu
    2023-06-22

    gin框架中怎么使用JWT

    这篇文章主要讲解了“gin框架中怎么使用JWT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“gin框架中怎么使用JWT”吧!什么是JWT?JWT全称JSON Web Token是一种跨域认证
    2023-06-30

    Gin框架怎么使用panic处理中间件

    这篇文章主要介绍“Gin框架怎么使用panic处理中间件”,在日常操作中,相信很多人在Gin框架怎么使用panic处理中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Gin框架怎么使用panic处理中间件
    2023-07-06

    Golang怎么使用Gin框架实现HTTP上传文件

    本文小编为大家详细介绍“Golang怎么使用Gin框架实现HTTP上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用Gin框架实现HTTP上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
    2023-07-05

    golang怎么使用Gin框架实现短信验证码功能

    golang怎么使用Gin框架实现短信验证码功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用json配置文件// 配置文件 "sms": { "s
    2023-06-20

    Gin框架使用panic处理中间件问题详解

    这篇文章主要介绍了Gin框架使用panic处理中间件问题,在Gin框架中,错误处理和panic处理是非常重要的功能。当处理HTTP请求时,可能会出现各种各样的错误,例如数据库连接错误、网络错误、权限问题等等
    2023-05-15

    golang中gin框架接入jwt如何使用token验证身份

    本篇内容介绍了“golang中gin框架接入jwt如何使用token验证身份”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jwtjwt的原理
    2023-06-22

    jQuery中的bind怎么使用

    在jQuery中,bind方法用于绑定一个或多个事件处理函数到选定元素上。它的语法格式如下:```javascript$(selector).bind(event, data, handler);```其中,参数说明如下:- `select
    2023-08-09

    vue中v-bind怎么使用

    本文小编为大家详细介绍“vue中v-bind怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中v-bind怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在vue中,v-bind指令主要用于属
    2023-07-04

    Gin框架中参数绑定的实现是怎样的

    Gin框架中参数绑定的实现是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content
    2023-06-22

    Java中怎么使用Nutz框架

    使用Nutz框架在Java中进行开发可以按照以下步骤进行:1. 导入Nutz框架的相关依赖:在项目的构建文件(如Maven的pom.xml)中添加Nutz框架的依赖项。你可以通过Nutz的官方网站或GitHub页面找到最新的版本和依赖信息。
    2023-08-24

    Golang中tinyrpc框架怎么使用

    本篇内容介绍了“Golang中tinyrpc框架怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!tinyrpc功能tinyrpc基于T
    2023-07-05

    Java中怎么使用Sinatra框架

    这篇文章主要讲解了“Java中怎么使用Sinatra框架”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中怎么使用Sinatra框架”吧!Sinatra 是一个微型的 Ruby 语言的
    2023-06-17

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录