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

news2024/11/14 13:53:13

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

  • 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
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RC电路(三):零点和极点

一、零极点定义 零点和极点是在自动控制原理中用于描述系统特性的概念。‌ 零点&#xff08;Zero&#xff09;&#xff1a;‌在传递函数的分子多项式等于零的解。即当系统的输入信号等于零时&#xff0c;‌输出信号不为零的情况下&#xff0c;‌输入信号与输出信号相等的点。‌…

人工智能系统测试生命周期详解之测试数据准备

前面的文章里我们已经整体介绍过了人工智能测试的生命周期&#xff0c;它需要经历测试需求的分析、测试环境的准备、数据的准备与验证、测试的执行预分析以及上线后的监控这样一个过程。前面的文章已经为大家介绍了人工智能系统测试生命周期的“需求分析”环节和“测试环境准备…

SPSS-主成分分析实践

相信各位小伙伴都知道主成分分析的原理&#xff0c;我们今天用SPSS来实现一下主成分分析 主成分分析步骤 对原来的全部指标进行标准化&#xff0c;以消除变量在水平和量纲的影响根据标准化的数据矩阵求出相关系数矩阵求出协方差矩阵的特征根和特征向量确定主成分&#xff0c;…

DRM(Direct Rendering Manager)直接渲染管理

DRM是Linux 内核的一个子系统&#xff0c;负责与现代显卡的GPU进行交互。DRM 公开了一个API (libdrm)&#xff0c;用户空间程序可以使用该API 向 GPU 发送命令和数据并执行诸如配置显示器模式设置之类的操作。DRM 最初是作为X 服务器直接渲染基础架构的内核空间组件开发的&…

大规模复杂场景三维重建与理解——学习笔记

一、完整的大规模复杂场景三维重建与理解系统 一个完整的大规模复杂场景三维重建与理解系统包含“自主式场景数据获取->高精度联合位姿解算->完整化三维几何重建->细粒度三维语义分割->结构化三维矢量表达->全天候长时定位定姿->高时效地图增量更新”等模块。…

2022年第一至第四批专精特新“小巨人”企业数据,企业名称、经营范围、公示批次等字段可查询

基本信息. 数据名称: 第一至第四批专精特新“小巨人”企业数据 数据格式: Shpxlsx 数据时间: 2022年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;《中国城市统计年鉴》中统计的工业企业数相关数据&#xff0c;对象为地级及以上的城市&#xff0c;统计…

【书生大模型实战营第三期 | 进阶岛第2关-Lagent 自定义你的 Agent 智能体】

学习心得&#xff1a;Lagent 自定义你的 Agent 智能体 摘要 Lagent 是一个为大语言模型设计的轻量级开源智能体框架&#xff0c;它不仅支持多种智能体范式&#xff0c;如 AutoGPT、ReAct&#xff0c;还集成了多种工具&#xff0c;包括但不限于 Arxiv 搜索、Google 搜索等。通…

电子行业数字工厂管理系统解决方案

电子行业数字工厂管理系统解决方案是针对电子企业特定需求而设计的一套综合管理系统&#xff0c;旨在通过数字化手段提升生产效率、优化资源配置、降低运营成本&#xff0c;并确保高品质产品的输出。以下是一个详细的电子行业数字工厂管理系统解决方案的概述&#xff1a; 一、系…

C语言:字符函数,字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数。 一. 字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用…

你知道AI模型是如何学习的吗?

在人工智能的广阔天地中&#xff0c;AI模型的学习方式不仅决定了其智能行为的深度和广度&#xff0c;更是推动技术进步和应用创新的关键动力。随着AI技术的飞速发展&#xff0c;我们越来越意识到&#xff0c;深入了解AI的学习机制对于把握其潜能至关重要。 我们将从基础概念出…

hive之greatest和least函数

1、greatest函数&#xff1a; greatest(col_a, col_b, ..., col_n)比较n个column的大小&#xff0c;过滤掉null或对null值进行处理&#xff0c;当某个column中是string&#xff0c;而其他是int/double/float等时&#xff0c;返回null&#xff1b; 举例&#xff1a; select g…

Python 中的变量赋值、多重赋值

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在编程中&#xff0c;变量赋值是最基础的操作之一。Python 作为一门动态类型语言&#xff0c;其变量赋值和多重赋值具有独特的灵活性和简洁性。本文将详细介绍 Python 中的变量赋值、多重赋值&#xff0c;并包含…

基于Ascend C的Matmul算子性能优化最佳实践

矩阵乘法是深度学习计算中的基础操作&#xff0c;对于提升模型训练和推理速度至关重要。昇腾AI处理器是一款专门面向AI领域的AI加速器&#xff0c;其AI Core采用达芬奇架构&#xff0c;以高性能Cube计算引擎为基础&#xff0c;针对矩阵运算进行加速&#xff0c;可大幅提高单位面…

JavaScript 逆向爬取实战

准备介绍&#xff1a; 当我们学习完整个 JS 逆向技巧后&#xff0c;这里是一次完整的分析爬取实战 案例介绍 本节案例网站不仅在 API 参数有加密&#xff0c; 而且前端 JS 也带有压缩混淆&#xff0c;其前端压缩打包工具使用 webpack , 混淆工具使用 javascript-obfuscator 。…

Spring @Transactional事务传播行为详解

目录 一、无事务情况 二、有事务情况 REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。 在复杂的业务场景中&#xff0c;多个事务方法之间的调用可能会导致事务的一致性&…

谷粒商城【renren-fast-vue】:npm install 报错

谷粒商城【renren-fast-vue】&#xff1a;npm install 报错 报错信息报错原因解决办法 报错信息 谷粒商城【renren-fast-vue】&#xff1a;npm install 报错 npm install 下载依赖的时候报错sass 版本与 node 版本不对应 报错原因 直接使用 npm 下载依赖&#xff0c;可能会…

RCE技巧

RCE技巧 Linux命令长度限制突破方法8个字符限制绕过过滤英文字母和数字php版本7php版本5 Linux命令长度限制突破方法 8个字符限制绕过 <?php <?php $param $_REQUEST[param]; if (strlen($param) < 8) {echo shell_exec($param); }shell_exec — 通过 shell 执行…

【大模型从入门到精通14】openAI API 构建和评估大型语言模型(LLM)应用2

这里写目录标题 评估大型语言模型&#xff08;LLM&#xff09;输出的方法构建评估标准实施评估协议利用专家比较案例研究评估客户服务聊天机器人学术文本摘要高级评估技术 评估大型语言模型&#xff08;LLM&#xff09;输出的方法 评估大型语言模型&#xff08;LLM&#xff09…

甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

无人机之电机篇

一、无人机使用什么类型的电动机 无人机主要使用直流无刷电机和伺服电机。 直流无刷电机通常用于无人机的推进系统&#xff0c;因为它具有强大的驱动力和高功率输出&#xff0c;能够为无人机提供足够的推力。 此外&#xff0c;直流无刷电机具有电动机启动转矩大、无刷向触点…