当被gin c.BindJSON捕获时,如何断言错误类型json.UnmarshalTypeError?
我正在尝试通过杜松子酒捕获绑定错误,对于来自go-playground/valivator/v10的所有验证错误,它都可以正常工作,但是当将其分解为适当的数据类型时,我遇到问题. 使用验证器标签(必需,...) 时,结构字段的失败验证将返回gin.ErrorTypeBind错误类型 ,但是如果我有一个结构 type Foo struct { ID int `json:"id"` Bar string `json:"bar"` } 和我要通过的JSON是错误的格式(传递字符串而不是ID的数字) { "id":"string", "bar":"foofofofo" } 它将因错误json: cannot unmarshal string into Go struct field Foo.id of type int 而失败 它仍然被捕获为gin.ErrorTypeBind在我的处理程序中作为绑定的错误,但是由于我需要区分验证错误和删除错误
30 2023-11-12
编程技术问答社区
从结构标签验证中返回自定义错误信息
我正在使用GO 1.17与杜松子酒一起使用,我想在将数据发送到数据库之前实现结构验证.我以 gin Documentation . 来为例. 在结构中,我们可以声明不同的标签来验证这样的字段: type User struct { FirstName string `json:"first_name" binding:"required"` LastName string `json:"last_name" binding:"required"` Age uint8 `json:"age" binding:"gte=0,lte=130"` Email string `json:"email" binding:"required,email"` FavouriteColor string `json:"favourite_color" binding:"iscolor"` }
6 2023-11-12
编程技术问答社区
杜松子酒测试
我的项目分为三个主要组成部分:控制器,服务和模型.当通过URI查询路由时,将调用控制器,然后调用服务与模型进行交互,然后通过GORM与数据库进行交互. 我正在尝试为控制器编写单元测试,但是我很难理解如何在模拟杜松子酒层时正确模拟服务层.我可以得到模拟的杜松子酒上下文,但是我无法在控制器方法中模拟该服务层.以下是我的代码: resourcecontroller.go package controllers import ( "MyApi/models" "MyApi/services" "github.com/gin-gonic/gin" "net/http" ) func GetResourceById(c *gin.Context) { id := c.Param("id") resource, err := services.GetResourceById(id) if err != nil {
22 2023-11-07
编程技术问答社区
在Golang中制作模拟的gin.Context
我正在使用杜松子酒框架编写REST API.但是我在测试控制器,研究TDD和模拟的情况下遇到了麻烦.我试图将TDD应用于我的代码,但不能. 我创建了一个非常减少的测试环境,并试图创建控制器测试.如何为gin.context创建模拟? 这是我的示例代码: package main import ( "strconv" "github.com/gin-gonic/gin" ) // MODELS type Users []User type User struct { Name string `json"name"` } func main() { r := gin.Default() r.GET("/users", GetUsers) r.GET("/users/:id", GetUser) r.Run(":8080") } // ROUTES func GetUsers(c *gin.Context)
20 2023-11-07
编程技术问答社区
如何为BindJSON设置模拟的gin.Context
我正在Go中设置测试. 我使用go-sqlmock测试mySQL连接并将杜松子作为框架.现在我尝试测试mySQL插入逻辑. 问题是我需要设置模拟gin.Context,该模拟gin.Context以后用于BindJSON. 但是我无法设置此gin.Context到目前为止. server side: golang db: mysql web framework: gin dao.go unc PostImageToDBDao(c *gin.Context, db *sql.DB) { // Because of this logic, I need to set gin.Context with json var imageData util.ImageData c.BindJSON(&imageData) for _, imageName := range imageData.IMAGENAMES {
14 2023-11-07
编程技术问答社区
如何对Go Gin处理函数进行单元测试?
我有这样的控制器函数. func GetMaterialByFilter(c *gin.Context) { queryParam := weldprogs.QueryParam{} c.BindQuery(&queryParam) materialByFilter, getErr := services.WeldprogService.GetMaterialByFilter(&queryParam) if getErr != nil { //TODO : Handle user creation error c.JSON(getErr.Status, getErr) return } c.JSON(http.StatusOK, materialByFilter) } queryparam struct就是这样.. type QueryParam struct {
10 2023-11-07
编程技术问答社区
如何模拟杜松子酒.Context?
嗨,我一直在尝试模拟杜松子酒. 我正在尝试他们在此解决方案路由器这是我遇到的错误 r.POST("/urls", urlRepo.CreateUrl) cannot use urlRepo.CreateUrl (value of type func(c controllers.Icontext)) as gin.HandlerFunc value in argument to r.POSTcompilerIncompatibleAssign 这是我以后创建的界面,也是我要测试的方法 type Icontext interface { BindJSON(obj interface{}) error JSON(code int, obj interface{}) AbortWithStatus(code int) AbortWithStatusJSON(code int, jsonObj interface{}) } func (reposi
32 2023-10-18
编程技术问答社区
在Golang中从Postgres获得嵌套的JSON结果
我正在使用 gin 和 gorp SQL: SELECT p.project_id, p.name, COALESCE(NULLIF(json_agg(a.*)::TEXT, '[null]'), '[]')::JSON AS apps FROM project p LEFT JOIN app a USING (project_id) WHERE p.user_id=19 GROUP BY p.project_id, p.name ORDER BY project_id 结果: golang type Project struct { ID int64 `db:"project_id, primarykey, autoincrement" json:"id"` UserID int64 `db:"user_id" json:"user_id"` Name s
22 2023-10-03
编程技术问答社区
如何在 Gin 路由器内呈现静态文件?
我想将JSON文件与Gin Server一起使用.并在HTML文件中设置一些自定义值.在其中使用JavaScript调用JSON文件. 我的应用结构: . ├── main.go └── templates ├── index.html └── web.json 我将这些基本源放入main.go文件中: package main import ( "net/http" "github.com/gin-gonic/gin" ) var router *gin.Engine func main() { router = gin.Default() router.LoadHTMLGlob("templates/*") router.GET("/web", func(c *gin.Context) { c.HTML( http.StatusOK,
18 2023-09-28
编程技术问答社区
Golang gin gonic网络框架代理路由到另一个后端
如何在 gin gongonic Web中,如何将一些路线的Web请求逆转到几条路线的另一条路线. Golang框架 是否有一种方法可以直接在手柄函数中转发? router := gin.New() router.Handle("POST", "/api/v1/endpoint1", ForwardToAnotherBackend) 解决方案 您可以使用标准库我还没有找到自己使用杜松子酒的理由,我很喜欢在可能的情况下坚持使用STDLIB. 但是,我相信您可以将此倒转处理程序包裹在gin.WrapH()中,以便能够与杜松子道路由器一起使用. 其他解决方案 这是我用于将端点的特定子集从杜松子酒框架转换为另一个后端的解决方案: router.POST("/api/v1/endpoint1", ReverseProxy()) 和: func ReverseProxy() gin.HandlerFunc { target := "localho
42 2023-08-11
编程技术问答社区
如何使用 gin 作为服务器来编写 prometheus 输出器指标
这是官方Prometheus Golang-Client示例: package main import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "cpu_temperature_celsius", Help: "Current temperature of the CPU.", }) func init() { // Metrics have to be registered to be exposed: prometheus.MustRegister
38 2023-07-14
编程技术问答社区
Golang的GIN中的JSON响应以加扰数据的形式返回
我有从数据库收集的数据创建的结构数组. 为简单起见,可以说这是结构: type Person struct { ID int `db:"id, json:"id"` } type PessoalController struct{} func (ctrl PessoalController) GetPessoal(c *gin.Context) { q := "select id from rh" rows, err := db.GetDB().Query(q) if err != nil { log.Fatal(err) } defer rows.Close() var pessoas []Pessoal var id for rows.Next() { err := rows.Scan(&id) if err != nil {
50 2023-06-13
编程技术问答社区
我是否应该在包一级声明变量,但在http处理程序之外?
我正在使用Gin Gonic作为HTTP框架,我需要按照这样的方式将一些路径分组为共享变量: ur := r.Group("/") ur.Use(package.Prepare) { ur.GET("/", package.Home) } 在Prepare处理程序中,我声明包装变量 package.tplPath因为我希望所有子路由都可以访问此变量,而不是重写每个HTTP处理程序中的代码. var tplPath = "" func Prepare(c *gin.Context) { _, filename, _, _ := runtime.Caller(0) s := helper.RelativeFilePath(filename) tplPath = s[1:len(s)] + "template/" } 我不知道每个过程如何使用,以及每个HTTP请求的变量.如果在包级别上声明一个变量,将在每个HTTP请求之后设置它? 这
22 2023-04-26
编程技术问答社区
如何在Gin中从前端获取数据?
令我感到羞耻的是,我无法弄清楚如何从杜松子酒框架中从前端获取数据.在django中,我获得了数据: user=request.data.get('user') print(user) 一切都是简单且可以理解的. 我应该如何在杜松子酒中做? user := c.Query("user") user := c.Param("user") user := c.Params.ByName("user") user := c.PostForm("user") println(user)//emptiness.... 解决方案 服务器Gin无法处理AXIOS的常规默认应用程序/JSON请求!!!什么??? 请求应作为应用程序/x-www-form-urlenCoded发送. 我在VUE项目中的决定: 将Vue-Resource代替Axios(Axios.post =>this.$ http.post) vue.http.options.emulatejson = true;在m
36 2023-04-26
编程技术问答社区
单元测试代码 := 运行时错误:无效的内存地址或取消引用的零值指针
我创建了一个正常工作的API,但是我有一个错误 运行时错误:无效的内存地址或无指针Derference 执行单元测试代码时. 您参考的完整响应 runtime error: invalid memory address or nil pointer dereference D:/Go/src/runtime/panic.go:199 (0x447473) panicmem: panic(memoryError) D:/Go/src/runtime/signal_windows.go:233 (0x447320) sigpanic: panicmem() D:/Projects/GoLang/cloudfactory-backend/db/teams.go:11 (0xb49b36) SelectAllTeams: func SelectAllTeams() (teams []models.Team, err error) { D:/Proj
34 2023-04-26
编程技术问答社区
将Tus可恢复文件上传协议与Gin-Gonic CORS问题相结合
我研究了与杜松子酒和TUS有关的CORS问题有关的类似问题.没有人解决我目前遇到的问题. 当前的实现通过添加一个小包装器来与标准NET/HTTP软件包一起使用. // The wrapping function func enableCors(w *http.ResponseWriter) { (*w).Header().Set("Access-Control-Allow-Origin", "*") } // Simplified version of the code composer := tusd.NewStoreComposer() store.UseIn(composer) handler, err := tusd.NewHandler(tusd.Config{ BasePath: "/files/", StoreComposer: composer,
44 2023-04-26
编程技术问答社区
golang:使用 gin 路由器为 net.Conn 服务
我的功能可以处理传入的TCP连接: func Handle(conn net.Conn) error { // ... } 另外,我有一个带有实现的手柄的初始杜松子路由器: router := gin.New() router.GET(...) router.POST(...) router.Run(addr)呼叫将在addr> 上启动单独的HTTP服务器 有什么办法可以使用此路由器来处理Handle函数内部的传入连接,而无需运行单独的HTTP服务器? 解决方案 创建type listener struct { ch chan net.Conn addr net.Addr } // newListener creates a channel listener. The addr argument // is the listener's network address. func newListener(addr net.Addr) *listen
38 2023-04-26
编程技术问答社区
如何在gin路由中添加多个组以实现api版本的继承?
我目前正在使用Go + Gin的API. API应包括一个版本字符串,例如字符串V1 http://127.0.0.1:3000/v1/user/get_username 这没问题,因为我可以用Gin 创建一个组 v1 := router.Group("/v1") v1.GET("/user/get_username", modules.UserGetUsername) 但是...如果我启动了新的API VERSION" V2",并且函数中的代码没有更改,则必须执行以下 v1 := router.Group("/v1") v1.GET("/user/get_username", modules.UserGetUsername) v2 := router.Group("/v2") v2.GET("/user/get_username", modules.UserGetUsername) 对此有更好的解决方案 - 也许是这样: v1_v2 := rou
38 2023-04-26
编程技术问答社区
如何使用Context.Request.Body并保留它?
我正在尝试编写一个中间件,我将对请求主体进行JSON模式验证.验证后,我需要再次使用请求主体.但是我无法弄清楚如何做到这一点.我推荐这篇文章 并找到了进入身体的方法.但是,一旦使用了请求主体,我就需要下一个功能. 这是示例代码: package main import ( "fmt" "io/ioutil" "net/http" "github.com/gin-gonic/gin" //"github.com/xeipuuv/gojsonschema" ) func middleware() gin.HandlerFunc { return func(c *gin.Context) { //Will be doing json schema validation here body := c.Request.Body x, _ := ioutil.ReadAll(bo
34 2023-04-26
编程技术问答社区