go-zero中基本配置及获取参数

一、使用配置文件启动项目

  • 1、在项目的etc文件夹下分别创建开发环境和测试环境的配置文件,这里简单点使用不同的端口

  • 2、配置Makefile文件启动命令来启动不同配置文件

    makefile 复制代码
    runDev:
    	go run users.go -f etc/application-dev.yml
    runProd:
    	go run users.go -f etc/application-prod.yml
  • 3、如果要使用pm2部署go-zero项目可以配置以下命令,这里演示window下打包和部署

    makefile 复制代码
    runDev:
    	go run users.go -f etc/application-dev.yml
    runProd:
    	go run users.go -f etc/application-prod.yml
    
    build:
    	CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go  build  users.go
    
    chmod:
    	chmod 777 users
    
    startDev:
    	pm2 start users.exe  -o ./out.log -e ./error.log --log-date-format="YYYY-MM-DD HH:mm Z" -- -f etc/application-dev.yml
    
    startProd:
    	pm2 start users.exe  -o ./out.log -e ./error.log --log-date-format="YYYY-MM-DD HH:mm Z" -- -f etc/application-prod.yml
  • 4、不太清楚如何使用pm2部署go项目的可以参考,链接地址

二、swagger文档基本使用

  • 1、安装依赖包

    properties 复制代码
    go install github.com/zeromicro/goctl-swagger@latest
  • 2、生成文档,**注意main.api**要根据项目实际的来写

    properties 复制代码
    goctl api plugin -plugin goctl-swagger="swagger -filename main.json" -api main.api -dir .
  • 3、在apifox中导入刚刚生成的swaggerjson文件

  • 4、关于go-zero中写文档可以自己网上搜索

  • 5、在api上定义

    properties 复制代码
    type PostDemoReq {
    	Name string `json:"name" validate:"required"` // 姓名
    	Age  int64  `json:"age" validate:"required,gte=1,lte=130"` // 年龄
    	// optional 表示可选,omitempty如果为空的时候不走后面
    	Mobile         string `json:"mobile,optional" validate:"omitempty,checkMobile"` // 手机号码
    	Email          string `json:"email,optional" validate:"omitempty,checkEmail"` // 邮箱地址
    	Date           string `json:"date" validate:"omitempty,checkDate,checkAfterDate"` // 时间
    	Password       string `json:"password" validate:"required"` // 密码
    	ConfimPassword string `json:"confimPassword" validate:"eqfield=Password"` // 确认密码
    }
  • 6、服务的定义

    properties 复制代码
    @server (
    	prefix: demo/v1
    	group:  demo
    )
    service demo-api {
    	@doc "添加"
    	@handler PostDemoHandler
    	post /postDemo (PostDemoReq) returns (Response)
    }
  • 7、查看apifox文档

三、获取客户端参数

目前来说几乎全部都是json方式前后端交付,这里就演示json的方式

  • 1、get请求获取urlpath参数,比如:xx/:id,注意这里反引号里面是path不是json

    properties 复制代码
    type IdReq {
    	Id int64 `path:"id"` // 主键id
    }
  • 2、get请求获取urlquery的参数,比如:xx?pageSize=10&pageNumber=1

    properties 复制代码
    type GetUserPageReq {
    	PageNumber int64 `form:"pageNumber"`
    	PageSize   int64 `form:"pageSize"`
    }
  • 3、当使用put请求的时候,url也有参数,请求提也有参数可以使用下面方式

    properties 复制代码
    type ModifyUser {
    	Id   int64  `path:"id"`
    	Name string `json:"name"`
    }
  • 4、如果上传文件,这时候要使用表单的方式接收参数,这个有点麻烦

    • 1、直接定义一个表单字段接收file数据

      properties 复制代码
      type UploadFileReq {
          File string `form:"file" binding:"required"`
      }
    • 2、定义服务

      properties 复制代码
      @server(
          prefix: demo/v1
          group: demo
      )
      service demo-api {
          @doc "上传文件"
          @handler UploadFileApi
          post /uploadFile (UploadFileReq) returns (Response)
      }
    • 3、生成swagger文档,导入到apifox中手动修改下数据类型

    • 4、接收客户端传递的参数

      go 复制代码
      func UploadFileApiHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
      	return func(w http.ResponseWriter, r *http.Request) {
      		fileData, fileHeader, err := r.FormFile("file")
      		fmt.Println(fileData, fileHeader, "上传文件")
      		l := demo.NewUploadFileApiLogic(r.Context(), svcCtx)
      		resp, err := l.UploadFileApi()
      		if err != nil {
      			httpx.ErrorCtx(r.Context(), w, err)
      		} else {
      			httpx.OkJsonCtx(r.Context(), w, resp)
      		}
      	}
      }
    • 5、另外在服务层直接使用阿里oss上传文件

      go 复制代码
      func (l *UploadFileLogic) UploadFile(data multipart.File, fileHeader *multipart.FileHeader) (resp interface{}, err error) {
      	imgType := strings.Split(fileHeader.Filename, ".")[1]
      	var fileType = false
      	if imgType == "jpg" || imgType == "gif" || imgType == "png" || imgType == "JPG" || imgType == "GIF" || imgType == "PNG" {
      		fileType = true
      		if fileHeader.Size > 1024*1024*5 {
      			return nil, errorx.NewDefaultError(errorx.BackUploadPngBiggerError)
      		}
      	}
      	if fileType == false {
      		return nil, errorx.NewDefaultError(errorx.BackUploadFileTypeError)
      	}
      	fileName := fileHeader.Filename
      	filePath, err := common.CosUpload(l.svcCtx.Cos, l.Logger, data, fileName)
      	return filePath, err
      }
  • 6、关于文件上传的补充,参考文档

四、关于直接上传文件

  • 1、定义api

    properties 复制代码
    type Response {
    	OK int `json:"ok"`
    }
    
    service upload-api {
    	@handler UploadHandler
    	post /upload returns (Response)
    }
  • 2、生成代码,修改handler文件

    go 复制代码
    package handler
    
    import (
    	"net/http"
    
    	"upload/internal/logic"
    	"upload/internal/svc"
    
    	"github.com/zeromicro/go-zero/rest/httpx"
    )
    
    func UploadHandler(ctx *svc.ServiceContext) http.HandlerFunc {
    	return func(w http.ResponseWriter, r *http.Request) {
    		l := logic.NewUploadLogic(r.Context(), ctx)
    		resp, err := l.Upload(r)
    		if err != nil {
    			httpx.Error(w, err)
    		} else {
    			httpx.OkJson(w, resp)
    		}
    	}
    }
  • 3、修改logic上传文件

    go 复制代码
    package logic
    
    import (
    	"context"
    	"fmt"
    	"io"
    	"net/http"
    	"os"
    	"path"
    
    	"upload/internal/svc"
    	"upload/internal/types"
    
    	"github.com/zeromicro/go-zero/core/logx"
    )
    
    const maxFileSize = 10 << 20 // 10 MB
    
    type UploadLogic struct {
    	logx.Logger
    	ctx    context.Context
    	svcCtx *svc.ServiceContext
    }
    
    func NewUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) UploadLogic {
    	return UploadLogic{
    		Logger: logx.WithContext(ctx),
    		ctx:    ctx,
    		svcCtx: svcCtx,
    	}
    }
    
    func (l *UploadLogic) Upload(r *http.Request) (resp *types.Response, err error) {
    	_ = r.ParseMultipartForm(maxFileSize)
    	file, handler, err := r.FormFile("myFile")
    	if err != nil {
    		fmt.Println(err)
    		return nil, err
    	}
    	defer file.Close()
    
    	fmt.Printf("Uploaded File: %+v\n", handler.Filename)
    	fmt.Printf("File Size: %+v\n", handler.Size)
    	fmt.Printf("MIME Header: %+v\n", handler.Header)
    
    	tempFile, err := os.Create(path.Join(l.svcCtx.Config.Path, handler.Filename))
    	if err != nil {
    		fmt.Println(err)
    		return nil, err
    	}
    	defer tempFile.Close()
    	io.Copy(tempFile, file)
    
    	return &types.Response{
    		OK: 0,
    	}, nil
    }
相关推荐
IT技术分享社区20 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码23 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农29 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_198030 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi36 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
疯狂的程需猿41 分钟前
一个百度、必应搜索引擎图片获取下载的工具包
golang·图搜索
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法