前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言进行Web开发(Gin)、配置文件

Go语言进行Web开发(Gin)、配置文件

作者头像
码客说
发布2024-03-29 13:07:37
810
发布2024-03-29 13:07:37
举报
文章被收录于专栏:码客码客

创建项目

创建项目 z-wiki

新建main.go

代码语言:javascript
复制
package main

import (
    "github.com/gin-gonic/gin"
)

func helloHandler(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "hello world!",
    })
}

func main() {
    // 初始化gin对象
    g := gin.Default()

    // 设置一个get请求,其URL为/hello,并实现简单的响应
    g.GET("/hello", helloHandler)

    // 启动服务
    g.Run()
}

目录下执行

代码语言:javascript
复制
go mod init z-wiki
go mod tidy

运行

代码语言:javascript
复制
go run main.go

访问:http://localhost:8080/hello

设置启动端口

代码语言:javascript
复制
port := "9999"
g.Run(":" + port)

允许跨域

下载

代码语言:javascript
复制
go get github.com/gin-contrib/cors

引用

代码语言:javascript
复制
import "github.com/gin-contrib/cors"

设置允许的域

代码语言:javascript
复制
func main() {
    g := gin.Default()

    corsConfig := cors.DefaultConfig()
    corsConfig.AllowOrigins = []string{"http://www.psvmc.cn", "http://psvmc.cn"}
	g.Use(cors.New(corsConfig))

	g.Run()
}

允许所有

代码语言:javascript
复制
g.Use(cors.Default())

等效于

代码语言:javascript
复制
corsConfig := cors.DefaultConfig()
corsConfig.AllowOrigins = []string{"*"}
g.Use(cors.New(corsConfig))

允许Header

代码语言:javascript
复制
corsConfig := cors.DefaultConfig()
corsConfig.AllowOrigins = []string{"*"}
corsConfig.AllowHeaders = []string{"Content-Type", "Z-UserId"}
g.Use(cors.New(corsConfig))

路由拆分

main.go

代码语言:javascript
复制
package main

import (
	"z-wiki/routers"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
)

func main() {
	// 初始化gin对象
	g := gin.Default()
	g.Use(cors.Default())
	routers.LoadUser(g)
	// 启动服务
	g.Run()
}

routers/user_router.go

代码语言:javascript
复制
package routers

import "github.com/gin-gonic/gin"

func LoadUser(e *gin.Engine)  {
    e.GET("/user/info", helloHandler)
}

func helloHandler(c *gin.Context)  {
    c.JSON(200, gin.H{
        "name": "小明",
    })
}

访问:http://localhost:8080/user/info

注意:

对其他包暴露的方法首字母要大写。

静态化与重定向

我们想项目的根路由重定向到项目的static/index.html

手相添加静态目录

代码语言:javascript
复制
// 设置静态文件目录
g.Static("/static", "./static")

添加路由重定向

routers/index_router.go

代码语言:javascript
复制
package routers

import (
	"github.com/gin-gonic/gin"
)

func LoadIndex(e *gin.Engine) {
	e.GET("/", func(c *gin.Context) {
		// 重定向到新的路由
		c.Redirect(301, "/static")
	})
}

加载路由

代码语言:javascript
复制
routers.LoadIndex(g)

请求参数

URL中的参数

代码语言:javascript
复制
c.Query("userid")

Form参数

代码语言:javascript
复制
c.Param("userid")

JSON参数

在 Gin 框架中,你可以使用 ShouldBindJSON() 方法来获取 POST 请求中的 JSON 参数。

以下是一个示例代码,演示如何在 Go 中使用 Gin 框架获取请求的 JSON 参数:

假设有一个 POST 请求发送了一个 JSON 参数,如 {"name": "Alice", "age": 30}

代码语言:javascript
复制
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	r := gin.Default()

	r.POST("/person", func(c *gin.Context) {
		var person Person

		if err := c.ShouldBindJSON(&person); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}

		c.JSON(http.StatusOK, gin.H{
			"name": person.Name,
			"age":  person.Age,
		})
	})

	r.Run(":9999")
}

在上面的示例中,我们定义了一个 Person 结构体来表示 JSON 中的参数。在路由 /person 中,我们使用 ShouldBindJSON() 方法将请求的 JSON 参数绑定到 person 变量中。如果绑定成功,则返回 JSON 格式的姓名和年龄信息;如果绑定失败,则返回错误信息。

当发送 POST 请求到 http://localhost:9999/person 并携带 JSON 参数时,Gin 框架将解析请求中的 JSON 参数,并将其存储在 person 变量中。然后我们可以通过 person.Nameperson.Age 访问参数的值。

文件参数

代码语言:javascript
复制
file, err := c.FormFile("file")
userid := c.PostForm("userid")

请求Header

代码语言:javascript
复制
userId := c.Request.Header.Get("Z-UserId")

文件上传

file_router.go

代码语言:javascript
复制
package routers

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"os"
	"path"
	"path/filepath"
	"strings"
	"time"
	"z-wiki/model"
)

func LoadFile(e *gin.Engine) {
	e.POST("/file/upload", uploadHandler)
}

func uploadHandler(c *gin.Context) {
	file, err := c.FormFile("file")
	userid := c.PostForm("userid")
	fmt.Println("userid:", userid)
	if err != nil {
		c.JSON(200, model.ResultVo[string]{Code: 1, Msg: "未找到文件", Obj: ""})
		return
	}
	dateStr := time.Now().Format("200601")
	pathStr := path.Join("static", "upload", dateStr)
	err = os.MkdirAll(pathStr, os.ModePerm)
	if err != nil {
		c.JSON(200, model.ResultVo[string]{Code: 1, Msg: "上传失败", Obj: ""})
		return
	}

	uuidStr := uuid.New().String()
	fileExt := filepath.Ext(file.Filename)
	filePathAll := path.Join(pathStr, uuidStr+strings.ToLower(fileExt))
	fmt.Println("filePathAll", filePathAll)
	err = c.SaveUploadedFile(file, filePathAll)
	if err != nil {
		c.JSON(200, model.ResultVo[string]{Code: 1, Msg: "上传失败", Obj: ""})
		return
	}
	c.JSON(200, model.ResultVo[string]{Code: 0, Msg: "上传成功", Obj: filePathAll})
}

resultvo.go

代码语言:javascript
复制
package model

type ResultVo[T any] struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Obj  T      `json:"obj"`
}

配置读取

配置文件

config/config.json

代码语言:javascript
复制
{
  "port":"8888",
  "db_host": "dbtest.psvmc.cn",
  "db_user": "zhangjian",
  "db_pwd": "Test_123456"
}

工具类

utils/config_reader.go

代码语言:javascript
复制
package utils

import (
	"encoding/json"
	"fmt"
	"os"
)

type Config struct {
	PORT   string `json:"port"`
	DBHost string `json:"db_host"`
	DBUser string `json:"db_user"`
	DBPwd  string `json:"db_pwd"`
}

func ReadConfig() *Config {
	file, err := os.Open("config/config.json")
	if err != nil {
		fmt.Println("Failed to open config file:", err)
		return nil
	}
	defer file.Close()

	decoder := json.NewDecoder(file)
	config := Config{}
	err = decoder.Decode(&config)
	if err != nil {
		fmt.Println("Failed to decode config file:", err)
		return nil
	}

	return &config
}

调用

代码语言:javascript
复制
config := utils.ReadConfig()
if config == nil {
    return
}
fmt.Println("-----------------------------")
fmt.Println("PORT:", config.PORT)
fmt.Println("DBHost:", config.DBHost)
fmt.Println("DBUser:", config.DBUser)
fmt.Println("DBPwd:", config.DBPwd)
fmt.Println("-----------------------------")

JSON序列化与反序列化

代码语言:javascript
复制
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func Json2Str() {
	person := Person{Name: "Alice", Age: 30}
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("转换失败:", err)
		return
	}
	jsonString := string(jsonData)
	fmt.Println("Json2Str:", jsonString)
}

func Str2Json() {
	str := `{"Name": "Alice", "Age": 30}`
	var person Person
	err := json.Unmarshal([]byte(str), &person)
	if err != nil {
		fmt.Println("转换失败:", err)
		return
	}
	fmt.Printf("Str2Json:%+v\n", person)
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建项目
  • 允许跨域
    • 下载
      • 引用
        • 设置允许的域
          • 允许所有
            • 允许Header
            • 路由拆分
            • 静态化与重定向
            • 请求参数
              • URL中的参数
                • Form参数
                  • JSON参数
                    • 文件参数
                    • 请求Header
                    • 文件上传
                    • 配置读取
                      • 配置文件
                        • 工具类
                          • 调用
                          • JSON序列化与反序列化
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档