go web framework gin group api 设计

假如让你来设计group api, 你该怎么设计呢?

group api 和普通api的区别在于前缀不同,如果group api的版本为v1.0 那么相对应的url为/v1.0/xxx, 如果是普通api的话那么api相对应的版本为/xxx

在gin web framework 中设计的原则也是以相对路径来区分。

// RouterGroup is used internally to configure router, a RouterGroup is associated with
// a prefix and an array of handlers (middleware).
type RouterGroup struct {
	Handlers HandlersChain #处理函数
	basePath string  #相对路径
	engine   *Engine #存在哪个engine上
	root     bool  #基于基树判断是否为root
}

先看gin中group 的添加规则:

	router := gin.New()
	users := router.Group("/users")

先看gin.New()默认的basePath是什么。

// New returns a new blank Engine instance without any middleware attached.
// By default the configuration is:
// - RedirectTrailingSlash:  true
// - RedirectFixedPath:      false
// - HandleMethodNotAllowed: false
// - ForwardedByClientIP:    true
// - UseRawPath:             false
// - UnescapePathValues:     true
func New() *Engine {
	debugPrintWARNINGNew()
	engine := &Engine{
		RouterGroup: RouterGroup{
			Handlers: nil,
			basePath: "/",  #默认为“/”
			root:     true,
		},
		FuncMap:                template.FuncMap{},
		RedirectTrailingSlash:  true,
		RedirectFixedPath:      false,
		HandleMethodNotAllowed: false,
		ForwardedByClientIP:    true,
		AppEngine:              defaultAppEngine,
		UseRawPath:             false,
		UnescapePathValues:     true,
		MaxMultipartMemory:     defaultMultipartMemory,
		trees:                  make(methodTrees, 0, 9),
		delims:                 render.Delims{Left: "{{", Right: "}}"},
		secureJsonPrefix:       "while(1);",
	}
	engine.RouterGroup.engine = engine
	engine.pool.New = func() interface{} {
		return engine.allocateContext()
	}
	return engine
}

  

查看router.Group("/users") 的调用

// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix.
// For example, all the routes that use a common middleware for authorization could be grouped.
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {
	return &RouterGroup{
		Handlers: group.combineHandlers(handlers),
		basePath: group.calculateAbsolutePath(relativePath), #根据relativePath这个参数,计算basePath
		engine:   group.engine,
	}
}

 查看group.calculateAbsolutePath(relativePath) 的调用

func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
	return joinPaths(group.basePath, relativePath)
}

 再查看joinPaths的实现

func joinPaths(absolutePath, relativePath string) string {
	if relativePath == "" { #如果没有relativePath 直接返回absolutePath,默认为“/”
		return absolutePath
	}
        #处理最后的“/”
	finalPath := path.Join(absolutePath, relativePath)
	appendSlash := lastChar(relativePath) == '/' && lastChar(finalPath) != '/'
	if appendSlash {
		return finalPath + "/"
	}
	return finalPath
}

  

转载于:https://www.cnblogs.com/Spider-spiders/p/10235516.html

### 集成Gin框架与SQLite 在Go语言中,`Gin` 是一个高性能的HTTP Web框架,而 `SQLite` 则是一个轻量级的关系型数据库。为了实现两者的集成,通常会使用第三方库来处理SQL操作。以下是具体方法: #### 安装依赖包 要使 `Gin` 和 `SQLite` 能够协同工作,需要安装以下两个主要依赖项: 1. **Gin Framework**: 提供Web服务功能。 2. **SQLite Driver**: 处理与SQLite数据库的交互。 可以通过运行以下命令安装这些依赖项: ```bash go get -u github.com/gin-gonic/gin go get -u github.com/mattn/go-sqlite3 ``` #### 数据库初始化 创建一个新的SQLite数据库并定义表结构。可以使用标准的SQL语句完成此过程[^1]。 ```go package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) func initDB() *sql.DB { db, err := sql.Open("sqlite3", "./test.db") // 打开或创建名为 test.db 的 SQLite 文件 if err != nil { panic(err) } sqlStmt := ` create table if not exists users (id integer not null primary key autoincrement, name text); delete from users;` _, err = db.Exec(sqlStmt) // 创建用户表并清空数据 if err != nil { fmt.Println(err) return nil } return db } ``` #### 结合Gin框架 一旦数据库准备就绪,就可以通过路由将请求映射到相应的业务逻辑上。下面展示了一个简单的例子,说明如何向SQLite插入新记录以及查询现有记录[^2]。 ```go package main import ( "net/http" "github.com/gin-gonic/gin" ) type User struct { // 用户模型 ID int `json:"id"` Name string `json:"name"` } var db *sql.DB // 插入一条新的用户记录 func createUser(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } stmt, _ := db.Prepare("insert into users(name) values(?)") res, err := stmt.Exec(user.Name) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } id, _ := res.LastInsertId() user.ID = int(id) c.JSON(http.StatusOK, gin.H{"message": "success", "data": user}) } // 查询所有用户 func getUsers(c *gin.Context) { rows, err := db.Query("select id, name from users") if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } defer rows.Close() users := []User{} for rows.Next() { var u User err := rows.Scan(&u.ID, &u.Name) if err != nil { continue } users = append(users, u) } c.JSON(http.StatusOK, gin.H{"users": users}) } func main() { r := gin.Default() db = initDB() if db == nil { fmt.Println("Failed to connect database.") return } defer db.Close() api := r.Group("/api/v1") { api.POST("/create_user", createUser) api.GET("/get_users", getUsers) } r.Run(":8080") } ``` 上述代码展示了基本的操作流程,包括启动服务器、设置API端点以及执行CRUD操作[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值