Gone框架介绍33 - HTTP 注入说明

gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/

文章目录

  • HTTP 注入说明
    • HTTP 依赖注入标签的格式
    • 支持注入的类型和响应标签
    • Query参数注入
      • 属性类型为简单类型[1]
      • 属性类型为简单类型的数组
      • 属性类型为结构体或者结构体指针
    • URL路径参数注入
    • Body注入
    • 请求头注入
    • Cookie注入
    • 高级
      • URL结构体注入
      • 请求头注入
      • 上下文结构体注入
      • 请求结构体注入
      • 请求响应接口注入
    • 备注

HTTP 注入说明

HTTP 依赖注入标签的格式

${attributeName} ${attributeType} gone:"http,${kind}=${key}"

举例:

router.GET("/search", function(in struct{selects []int `gone:"http,query=select"`
}){//注入值in.selects为`[]int{1,2,3}`fmt.Printf("%v", in.selects)
})

上面例子中,

  • selects为属性名(attributeName);
  • []int为属性类型(attributeType);
  • query为注入类型(kind);
  • select为注入键值(key)。

支持注入的类型和响应标签

名称属性类型${attributeType}注入类型${kind}注入键值${key}说明
上下文注入gone.Context//(不推荐)注入gin请求上下文对象,不需要类型${kind}和键值${key}
上下文注入*gone.Context//(推荐)注入gin请求上下文指针,不需要类型${kind}和键值${key}
请求注入http.Request//不推荐)注入http.Request对象,不需要类型${kind}和键值${key}
请求注入*http.Request//(推荐)注入http.Request指针,不需要类型${kind}和键值${key}
地址注入url.URL//(不推荐)注入url.URL,不需要类型${kind}和键值${key}
地址注入*url.URL//(推荐)注入url.URL指针,不需要类型${kind}和键值${key}
请求头注入http.Header//(推荐)注入http.Header(请求头),不需要类型${kind}和键值${key}
响应注入gone.ResponseWriter//注入gin.ResponseWriter(用于直接写入响应数据),不需要类型${kind}和键值${key}
Body注入结构体、结构体指针body/body注入;将请求body解析后注入到属性,注入类型为 body,不需要“注入键值${key}”;框架根据Content-Type自动判定是json还是xml等格式;每个请求处理函数只允许存在一个body注入
请求头单值注入number | stringheader缺省取字段名以键值${key}key获取请求头,属性类型支持 简单类型[1],解析不了会返回参数错误
URL路径参数注入number | stringparam缺省取字段名以“注入键值${key}”为key调用函数ctx.Param(key)获取Url中定义的参数值,属性类型支持 简单类型[1],解析不了会返回参数错误
Query参数注入number | string | []number | []string | 结构体 | 结构体指针query缺省取字段名以“注入键值${key}”为key调用函数ctx.Query(key)获取Query中的参数,属性类型支持 简单类型[1]支持简单类型的数组,支持结构体和结构体指针,解析不了会返回参数错误
Cookie注入number | stringcookie缺省取字段名以“注入键值${key}”为key调用函数ctx.Context.Cookie(key)获取Cookie的值,属性类型支持 简单类型[1],解析不了会返回参数错误

Query参数注入

属性类型为简单类型[1]

解析不了会返回参数错误。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {yourName string `gone:"http,query=name"` //注册请求query中的name参数name string `gone:"http,query"` //注册请求query中的name参数;不指定参数名,则取属性名作为参数名age int `gone:"http,query=age"` //int类型}) string {return fmt.Sprintf("hello, %s, your name is %s", in.yourName, in.name)},)

属性类型为简单类型的数组

解析不了会返回参数错误。
下面代码,query为?keyword=gone&keyword=is&keyword=bestin.keywords的值将会为 []string{"gone","is","best"}

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {keywords []string `gone:"http,query=keyword"` //简单类型的query数组参数注入}) string {return fmt.Sprintf("hello, keywords is [%v]", in.keywords)},)

属性类型为结构体或者结构体指针

这种类型key无需指定;假设query为?page=1&pageSize=20&keyword=gone&keyword=is&keyword=bestin.req的值将会为 {1,20,[]string{"gone","is","best"}};注意结构体中可以使用form标签进行属性映射。

解析不了会返回参数错误。

	type Req struct {Page     string   `form:"page"`PageSize string   `form:"pageSize"`Keywords []string `form:"keywords"`}ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {req Req `gone:"http,query"`req2 *Req `gone:"http,query"`}) string {fmt.Println(in.req)return fmt.Sprintf("hello, keywords is [%v]", in.req.Keywords)},)

URL路径参数注入

URL 路径参数,是指定义在URL路由中的参数,注入属性的类型支持stringint,uint,float64等数字类型,解析不了会返回参数错误。如下:

	ctr.rootRouter.Group("/demo").POST("/hello/:name", //url中定义参数名为namefunc(in struct {name string `gone:"http,param"` //不指定参数名,使用属性名作为参数名name2 string `gone:"http,param=name"` //使用key指定参数名}) string {return "hello, " + in.name},)

Body注入

Body注入,是指读取HTTP请求正文内容,解析成结构体,注入属性的类型支持结构体、结构体指针,解析不了会返回参数错误。

支持多种ContentType:json、xml、form-data、form-urlencoded等,不传ContentType时,默认为application/x-www-form-urlencoded。

结构体可以使用form标签进行form-data、form-urlencoded的属性映射;xml标签进行xml的属性映射;json标签进行json的属性映射。

具体规则可以参考:gin#Model binding and validation。

举例如下:

	type Req struct {Page     string   `form:"page" json:"page,omitempty" xml:"page" binding:"required"`PageSize string   `form:"pageSize" json:"pageSize,omitempty" xml:"pageSize" binding:"required"`Keywords []string `form:"keywords" json:"keywords,omitempty" xml:"keywords" binding:"required"`}ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {req Req `gone:"http,body"`  //注意:body只能被注入一次,因为 writer被读取后就变成空了// req2 *Req `gone:"http,body"`}) string {fmt.Println(in.req)return fmt.Sprintf("hello, keywords is [%v]", in.req.Keywords)},)

请求头注入

HTTP请求头注入,用于获取某个请求头信息,注入属性的类型支持stringint,uint,float64等数字类型,解析不了会返回参数错误。
比如下面代码,可以用于读取请求头中的Content-Type信息。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {contentType string `gone:"http,header"` //不指定参数名,使用属性名作为参数名contentType2 string `gone:"http,header=contentType"` //使用key指定参数名}) string {return "hello, contentType = " + in.contentType},)

Cookie注入

Cookie注入,用于获取某个cookie信息,注入属性的类型支持stringint,uint,float64等数字类型,解析不了会返回参数错误。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {token string `gone:"http,cookie"` //不指定参数名,使用属性名作为参数名token2 string `gone:"http,header=token"` //使用key指定参数名}) string {return "hello, your token in cookie is" + in.token},)

高级

另外,我们还支持几种特殊结构体(或结构体指针、接口、map)的注入,由于golang的“值拷贝”推荐使用指针注入,这些结构体代表了HTTP请求、响应、上下文等,这些结构体的注入不需要指定kindkey

URL结构体注入

支持属性类型为 url.URL 或者 *url.URL,该类型定义在net/url包中,代表了HTTP请求的URL。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {url *url.URL `gone:"http"` //使用结构体指针url2 url.URL `gone:"http"` //使用结构体}) string {return "hello, your token in cookie is" + in.token},)

请求头注入

支持属性类型为 http.Header,该类型定义在net/http包中,代表了HTTP请求的Header。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {header http.Header `gone:"http"`}) string {return "hello, your token in cookie is" + in.token},)

上下文结构体注入

支持属性类型为 gin.Content 或者 *gin.Content,该类型定义在github.com/gin-gonic/gin包中,代表了HTTP请求的上下文。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {context *gin.Content `gone:"http"` //使用结构体指针context2 gin.Content `gone:"http"` //使用结构体}) string {return "hello, your token in cookie is" + in.token},)

请求结构体注入

支持属性类型为 http.Request 或者 *http.Request,该类型定义在net/http包中,代表了HTTP请求信息。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {request *http.Request `gone:"http"` //使用结构体指针request2 http.Request `gone:"http"` //使用结构体}) string {return "hello, your token in cookie is" + in.token},)

请求响应接口注入

支持属性类型为 gin.ResponseWriter,该类型定义在github.com/gin-gonic/gin包中,代表了HTTP响应信息,可以使用该接口响应请求信息。

	ctr.rootRouter.Group("/demo").POST("/hello",func(in struct {writer gin.ResponseWriter `gone:"http"`}) string {return "hello, your token in cookie is" + in.token},)

备注

[1]. 简单类型指 字符串、布尔类型 和 数字类型,其中数字类型包括:

  • 整数类型:int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64
  • 非负整数类型:uint、uint8、uint16、uint32、uint64
  • 浮点类型:float32、float64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO是什么?SEO相关发展历史

一、SEO是什么意思? SEO(Search Engine Optimization),翻译成中文就是“搜索引擎优化”。简单来讲,seo是指自然搜索结果下获得的网站流量的技术,是可以不用花钱就可以让自己的网站有好的排名,也…

关于Redis知识的理解

系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 文章目录 Redis的由来一、Redis数据类型的发展…

SpringTask Cron表达式

Cron表达式格式 1.Cron表达式格式 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 秒 分 时 一个月第几天 月 一个星期第几天 年 &…

fegin返回参数统一处理

相关版本: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version></parent><properties><spring-cloud.version>2023.0.0</spri…

C语言:生命周期和作用域,static和extern

关键字static与extern 1.作用域&#xff08;scope&#xff09;&#xff1a;代码中能够访问到变量的范围&#xff08;变量可以被使用的文本区间&#xff09;。&#xff08;分为全局作用域和局部作用域&#xff09; ☺全局作用域&#xff1a;在整个程序中都能访问的变量。通常…

C语言入门系列:数据类型转换

文章目录 一&#xff0c;自动类型转换1&#xff0c;赋值运算1.1&#xff0c;浮点数赋值给整型变量-不安全1.2&#xff0c;整数赋值给浮点数变量-安全1.3&#xff0c;窄类型赋值给宽类型-安全1.4&#xff0c;宽类型赋值给窄类型-不安全 2&#xff0c;混合类型的运算2.1&#xff…

Python 连接clickhouse常用的三种方式

1. 概述 ClickHouse是一个开源的分布式列式数据库管理系统&#xff0c;它被设计用于存储和分析大规模数据。Python是一种流行的编程语言&#xff0c;凭借其简洁的语法和丰富的生态系统&#xff0c;成为了数据处理和分析的首选语言之一。在Python中&#xff0c;我们可以使用多种…

Ubuntu24使用kubeadm部署高可用K8S集群

Ubuntu24使用kubeadm部署高可用K8S集群 使用kubeadm部署一个k8s集群&#xff0c;3个master1个worker节点。 1. 环境信息 操作系统&#xff1a;ubuntu24.04内存: 2GBCPU: 2网络: 能够互访&#xff0c;能够访问互联网 hostnameip备注k8s-master1192.168.0.51master1k8s-maste…

20.Cargo和Crates.io

标题 一、采用发布配置自定义构建1.1 默认配置1.2 修改配置项 二、将crate发布到Crates.io2.1 编写文档注释2.2 常用&#xff08;文档注释&#xff09;部分2.3 文档注释作用测试2.4 为包含注释的项添加文档注释2.5 使用pub use导出公有API2.6 创建Crates.io账号2.7 发布2.8 版本…

【Flutter】基础教程:从安装到发布

Flutter 是一种流行的开源移动应用开发框架&#xff0c;由 Google 开发&#xff0c;可用于构建高性能、跨平台的移动应用。本教程将带领你从安装 Flutter 开发环境开始&#xff0c;一步步完成第一个程序&#xff0c;并介绍如何将应用发布到各个平台上。 跨端原理的关键点包括&a…

基于STM32的智能停车场管理系统

目录 引言环境准备智能停车场管理系统基础代码实现&#xff1a;实现智能停车场管理系统 4.1 车位检测模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能停车场管理与优化问题解决方案与优化收尾与总结 1. 引言 智能停车场管理系统通…

Linux常用命令(17)—pastesortcomm命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

kotlin空类型安全 !! ?. ?:

1、定义可空类型 fun main(){// 定义可空类型var x:String? "hello"x null } 2、!! 强转类型 定义可空类型之后&#xff0c;如果使用其内置方法&#xff0c;编译不会通过&#xff0c;因为值有可能为null&#xff0c;可以使用 !! 把类型强转为不可空&#xff1a…

仿中波本振电路的LC振荡器电路实验

手里正好有一套中波收音机套件的中周。用它来测试一下LC振荡器&#xff0c;电路如下&#xff1a; 用的是两只中频放大的中周&#xff0c;初步测试是用的中周自带的瓷管电容&#xff0c;他们应该都是谐振在465k附近。后续测试再更换电容测试。 静态电流&#xff0c;0.5到1mA。下…

malloc和new的本质区别

目录 一、结论 二、示例 1.实现类T 2.用malloc分配类T的内存空间 3.用new分配类T的内存空间 一、结论 malloc 和 new 都是用于在运行时动态分配内存的机制。但它们之间存在一些本质的区别&#xff0c;主要是在使用方面&#xff0c;现在我们直接说结论&#xff0c;然后在通过…

第5天:函数

学习目标 理解函数的基本概念和作用掌握函数的定义和调用学习参数传递和返回值了解作用域的概念 学习内容 1. 函数的基本概念 函数是组织代码的基本方式&#xff0c;它将一组逻辑相关的操作封装在一起&#xff0c;通过函数名调用函数&#xff0c;可以使代码更简洁、更易读和…

ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 01 需求说明 介绍一下ArcGIS与Excel统计分区各地类的三调地类面积。 ArcGIS统计分析不会&#x…

Unity客户端的Http通讯实战

背景知识 在Unity游戏开发中&#xff0c;一个常见场景是&#xff0c;后端扔过来一个Swagger后端接口网页&#xff0c;需要你使用对应的接口对应的接口发送和接收数据&#xff0c;如图所示为发起Get请求&#xff1a; 我们可以通过点击Try it out按钮直接在网页上测试收发数据&a…

spring整合openAI大模型之Spring AI

文章目录 一、SpringAI简介1.什么是SpringAI2.SpringAI支持的大模型类型&#xff08;1&#xff09;聊天模型&#xff08;2&#xff09;文本到图像模型&#xff08;3&#xff09;转录&#xff08;音频到文本&#xff09;模型&#xff08;4&#xff09;嵌入模型&#xff08;5&…

Guava-EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式&#xff0c;它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化&#xff0c;观察者模式都比较熟悉&#xff0c;这里会简单介绍一下&#xff0c;重点介绍的是如何泛化的进行方法的注册以及…