我是否应该在包一级声明变量,但在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请求之后设置它? 这
10 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
24 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
4 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,
12 2023-04-26
编程技术问答社区
如何模拟杜松子酒.Context?
嗨,我一直在尝试模拟杜松子酒.Context,但我无法使其正常 我正在尝试他们在这个 solution 中路由器这是我遇到的错误 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 interfac
12 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
6 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
8 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
18 2023-04-26
编程技术问答社区
在TCP4而不是TCP6上收听
我正在使用 https://github.com/gin-gin-gonic/gin HTTP服务 但是,当我部署它时,它会不断部署在TCP6上(根据NetStat) r := gin.Default() //none of these are working , It keeps being listed on tcp6 r.Run(":8080") r.Run("*:8080") r.Run("0.0.0.0:8080") 解决方案 文档状态 运行将路由器连接到HTTP.Server,并开始侦听和服务HTTP请求.这是http.listenandserve(addr,路由器) 的快捷方式 您可以使用http.Server http软件包在ListenAndServe 中直接启动服务器 server := &http.Server{Handler: r} l, err := net.Listen("tcp4", addr) if err != nil {
6 2023-04-26
编程技术问答社区
设置Gin中未找到的路线
我已经设置了默认路由器和杜松子酒中的一些路由: router := gin.Default() router.POST("/users", save) router.GET("/users",getAll) 但是如何处理杜松子酒中找不到的404路线? 最初,我正在使用httprouter,我了解杜松子酒使用,所以这就是我最初拥有的... router.NotFound = http.HandlerFunc(customNotFound) 和功能: func customNotFound(w http.ResponseWriter, r *http.Request) { //return JSON return } ,但这与杜松子酒不起作用. 我需要能够使用c *gin.Context返回JSON,以便可以使用: c.JSON(404, gin.H{"code": "PAGE_NOT_FOUND", "message": "P
8 2023-04-26
编程技术问答社区
在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)
8 2023-04-26
编程技术问答社区
接口转换:接口{}是nil,不是bool
我相对较新. 我正在对现有项目进行更改. 我需要检索HTTP请求的主体中可能存在的元素的值并弹出. var returnValues = body.Params["returnValues"].(bool) delete(body.Params, "returnValues") 我在第一行遇到错误. 接口转换:接口{}是零,不是bool 样品主体: { "Params": { "returnValues": true } } 解决方案 始终,如果您访问接口或默认的nil类型的地图并使用该地图进行操作,请确保在使用之前,在地图中存在该键的值.如果地图中不存在该值,它将以零参考返回nil和恐慌. r, ok := body.Params["returnValues"] if !ok { // returnValues not present in Params map. Handle the scenari
8 2023-04-26
编程技术问答社区
GO存储数据返回EOF
我是Golang的新手,我正在尝试构建REST API,到目前为止,终点值对我有用,但是我在Post方法(创建用户)方面遇到困难: : 这就是我的用户结构的样子: type User struct { ID uint32 `gorm:"primary_key;auto_increment" json:"id"` Name string `json:"name" binding:"required"` Email string `json:"email" binding:"required"` Password string `json:"password" binding:"required"` CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"` UpdatedAt time.
10 2023-04-26
编程技术问答社区
Gin通配符路线与现有的孩子们冲突
我想构建一个 gin 服务以下路线的程序: r.GET("/special", ... // Serves a special resource. r.Any("/*", ... // Serves a default resource. 但是,运行时的这种程序恐慌: [GIN-debug] GET /special --> main.main.func1 (2 handlers) [GIN-debug] GET /* --> main.main.func2 (2 handlers) panic: wildcard route '*' conflicts with existing children in path '/*' 是否可以创建一个为每个路由提供默认资源的杜松子酒程序,除了以提供不同资源的单个吗? 网络上的许多页面使我相信使用默认的杜松子路由器是不可
4 2023-04-26
编程技术问答社区
如何在杜松子酒中结合一组路线?
我在两个不同的软件包中为gin专门为gin路由创建了两个不同的组,我想将它们合并到一个文件中.这是我的userroutes.go文件. package userrouter import ( "github.com/gin-gonic/gin" ) //UserRoutes for user func UserRoutes() *gin.RouterGroup { r := gin.Default() v1 := r.Group("/user") { v1.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) } return v1 } 和todoroutes.go AS package tod
12 2023-04-26
编程技术问答社区
如何在 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,
8 2023-04-26
编程技术问答社区
如何在琴酒中进行路线分组?
我想将路由分组到不同的文件中,因此主文件不会很混乱. 我想要他们自己的文件中这样的东西: v1 := router.Group("/v1") { v1.Group("users", usersRoutes) v1.Group("pictures", picturesRoutes) v1.Group("friends", friendsRoutes) } 因此,*Routes中的每一个看起来都这样: users := v1.Group("/users") { users.GET("/", getUsers) users.POST("/", createUser) } 这可能吗?现在我的代码看起来像这样: package app import ( "net/http" "github.com/gin-gonic/gin" ) func getUrls() { v1 := router.Group("/v1")
8 2023-04-26
编程技术问答社区
如何在Golang中使用Gin web框架向路由器处理程序传递参数?
我正在使用gin, https://gin-github.io/gin/,用Golang构建一个简单的Restful JSON API. 路线是用这样的东西设置的: func testRouteHandler(c *gin.Context) { // do smth } func main() { router := gin.Default() router.GET("/test", testRouteHandler) router.Run(":8080") } 我的问题是如何将论点传递给TestRouteHandler函数?例如,通用的数据库连接可能是一个人想要在路由之间重复使用的东西. 是在全球变量中将其提供的最佳方法吗?还是有其他方法可以传递额外的变量到testRoutehandler函数?是否有有关函数的可选论点? ps.我刚刚开始学习,所以很明显我缺少:) 解决方案 使用我在评论上发布的链接,我创建了一个简单
14 2023-04-26
编程技术问答社区
如何为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 {
16 2023-04-26
编程技术问答社区
Go-Gin多次读取请求正文
在对其数据执行验证后,我正在尝试用数据恢复上下文.我需要数据以稍后在下一个功能中按需要移动. 我是Golang的新手,以下代码是我可以走的.非常感谢任何帮助和更好的方法. 预先感谢. 验证中间件 func SignupValidator(c *gin.Context) { // Read the Body content // var bodyBytes []byte // if c.Request.Body != nil { // bodyBytes, _ = ioutil.ReadAll(c.Request.Body) // } var user entity.User if err := c.ShouldBindJSON(&user); err != nil { validate := validator.New() if err := validate.Struc
8 2023-04-26
编程技术问答社区