概述
说明:本工程为最近本示例工程, 没有添加项目需要的启动参数,没有与数据库的交互, User对象的定义也只是个示例。但是包含了从Query path 以及body获取参数的示例。
整体工程在这里
代码结构
1, 创建webserver
package main
import (
"flag"
myrouter "ginportdemo/pkg/router"
"github.com/gin-gonic/gin"
"k8s.io/klog"
"net/http"
"time"
)
/*
GET http://127.0.0.1:8090/users
GET http://127.0.0.1:8090/usersfind?username=tom&email=test1@163.com
PUT http://127.0.0.1:8090/users body {"userName":"tester1"}
启动参数 --log_file=C:Fginportdemo.log --logtostderr=false --alsologtostderr=true
--logtostderr=false表示输出到日志文件中,不再标准输出输出中展示,该参数默认值为true,
--alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件, 该参数为true后控制台和日志文件同时都有
这是简单示例gin运行简单示例
*/
func main() {
klog.InitFlags(nil)
defer klog.Flush()
flag.Parse()
klog.Info("start gin webserver on specific port")
router := gin.Default()
myrouter.ConfigRouter(router)
webServer := &http.Server{
Addr: ":8090",
Handler: router,
ReadTimeout: 15 * time.Second,
WriteTimeout: 15 * time.Second,
MaxHeaderBytes: 1 << 20,
}
webServer.ListenAndServe()
//router.Run()
// router.Run(":8090") 也能运行制定端口和ip上
}
2, 创建对应domain和controller
备注,示例工程没有service层,直接在controller中完成所需示例
package controller
import (
"fmt"
mydomain "ginportdemo/pkg/domain"
"github.com/gin-gonic/gin"
"k8s.io/klog"
"net/http"
)
type UserController struct {
// service or some to access DB method
}
func NewUserController() *UserController {
controller := UserController{}
return &controller
}
func (c *UserController) CreateOneUser(context *gin.Context) {
klog.Infof("create one user")
var req mydomain.UserCreateReq
if err := context.ShouldBindJSON(&req); err != nil {
context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//不能直接通过req初始化User, 除非User没有UserId字段
// user := mydomain.User{UserId: 1, UserName: userName} 会报cannot use promoted field UserCreateReq.UserName in struct literal of type domain.User
user := mydomain.User{}
user.UserName = req.UserName
user.UserId = 0
context.JSON(http.StatusOK, gin.H{
"result": user,
"msg": "create user successfully",
})
}
func (c *UserController) GetAllUsers(context *gin.Context) {
klog.Infof("get all user")
//H is a shortcut for map[string]interface{}
var users []mydomain.User
for i := 0; i < 3; i++ {
userName := fmt.Sprintf("tom%d", i)
user := mydomain.User{UserId: 1}
user.UserName = userName
users = append(users, user)
}
context.JSON(http.StatusOK, gin.H{
"result": users,
"count": len(users),
})
}
func (c *UserController) GetOneUser(context *gin.Context) {
userId := context.Param("userId")
klog.Infof("get one user by id %q", userId)
}
/*
// 匹配的url格式: /usersfind?username=tom&email=test1@163.com
*/
func (c *UserController) FindUsers(context *gin.Context) {
userName := context.DefaultQuery("username", "张三")
email := context.Query("email")
// 执行实际搜索,这里只是示例
context.String(http.StatusOK, "search user by %q %q", userName, email)
}
func (c *UserController) UpdateOneUser(context *gin.Context) {
userId := context.Param("userId")
klog.Infof("update user by id %q", userId)
}
func (c *UserController) DeleteOneUser(context *gin.Context) {
userId := context.Param("userId")
klog.Infof("delete user by id %q", userId)
}
3, 配置路由
package router
import (
mycontroller "ginportdemo/pkg/controller"
"github.com/gin-gonic/gin"
)
func ConfigRouter(router *gin.Engine) {
userController := mycontroller.NewUserController()
router.GET("/users", userController.GetAllUsers)
router.GET("/usersfind", userController.FindUsers)
router.GET("/users/:userId", userController.GetOneUser)
router.PUT("/users", userController.CreateOneUser)
router.POST("/users/:userId", userController.UpdateOneUser)
router.DELETE("/users/:userId", userController.DeleteOneUser)
}
4, 效果
创建用户的示例
获取全部用户的示例
根据条件查询用户的示例
最后
以上就是正直火龙果为你收集整理的基于Gin的go webserver示例工程的全部内容,希望文章能够帮你解决基于Gin的go webserver示例工程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复