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

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

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

  • 2、配置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下打包和部署

    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、安装依赖包

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

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

    在这里插入图片描述

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

  • 5、在api上定义

    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、服务的定义

    
    @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

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

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

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

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

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

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

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

      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上传文件

      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

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

    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上传文件

    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
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值