我是靠谱客的博主 正直火龙果,最近开发中收集的这篇文章主要介绍基于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: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示例工程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部