基于Gin的go webserver示例工程

说明:本工程为最近本示例工程, 没有添加项目需要的启动参数,没有与数据库的交互, 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:\F\ginportdemo.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, 效果

创建用户的示例
在这里插入图片描述

获取全部用户的示例
在这里插入图片描述

根据条件查询用户的示例
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值