当前位置: 首页 > article >正文

go-zero学习笔记(二)

利用goctl生成api服务

  1. 编写api文件

    //版本信息, import中的版本信息必须与被import的api版本信息一样
    syntax="v1"
    
    // 支持引入其他api文件
    // 这在多接口下非常有用
    // 如果不可以引入,对于多接口情况,所有的接口写在同一个文件,很容易造成混乱,阅读和修改也不太方便
    // 支持引入后,可以将接口按照某一规则分组,分文件书写,这样对于后续的阅读修改都较为便利,
    // 搞一个主api文件,将其他文件全部引入即可
    import "***.api"
    
    // info 信息 可选
    info(
        title: "type title here"
        desc: "type desc here"
        author: "type author here"
        email: "type email here"
        version: "type version here"
    )
    
    // 1. 数据类型:基本类型都支持,切片用 []数据类型 表示,也支持map, 指针,以及自定义数据类型
    // 2. 标签:支持json、form、path、header
    //      json:从请求头body中读取数据,一般在post方法中使用
    //      form:从请求的url的参数中读取数据,一般在get方法中使用
    //      path:从请求的url中读取数据,如:ID `path:"id"` 路由定义:/foo/:id  url: /foo/123 会将url中的123读取到
    //      header:从请求的header中读取数据
    // 3. 参数校验规则: 支持optional、options、default、range
    //      optional:当前参数可选,`json:"foo,optional"`
    //      options:当前参数仅可接收的枚举值,枚举值之间用 | 分割,`json:"gender,options=foo|bar"`
    //      default:当前参数默认值,`json:"gender,default=male"`
    //      range:当前参数数值有效范围,仅对数值有效,`json:"age,range=[0:120]"`
    type (
        GetInfoReq {
            IDs []string `json:"IDs"`
        }
    
        GetInfoData {
            ID           string `json:"ID"`
            Name         string `json:"Name"`
            MD5          string `json:"md5"`
            Size         int64  `json:"Size"`
            Uptime       int64  `json:"uptime"`
        }
    
        GetInfoResp {
            Data        []*GetInfoData          `json:"data"`
            Msg         string                  `json:"msg"`
            Code        int64                   `json:"code"`
            RequestID   string                  `json:"requestId"`
        }
    )
    
    // 修饰其紧挨的service块,且一个server块只能修饰一个service块
    @server(
        prefix: api/demo/v1          // url的前缀(可选)
        group: demo                  // 群组,会在goctl生成的代码的handler、logic中体现(可选)
        middleware: AuthInterceptor  // 中间件, 多个中间件用逗号分割(可选)
        // 其他关键字参考gozero官网 https://go-zero.dev/docs/tutorials 、https://go-zero.dev/docs/reference
    )
    
    // 服务条目:对单个 HTTP 请求的描述,包括 @doc 语句,handler 语句,路由语句信息
    // 1. @doc 对单个路由的 meta 信息描述,一般为 key-value 值, 传递给 goctl 及其插件来进行扩展生成
    // 2. @handler handlerName 对单个路由的 handler 信息控制,主要用于生成 golang http.HandleFunc 的实现转换方法
    // 3. 路由语句,包括请求方法,请求路径,请求体,响应体信息
    //      请求方法包括:"get"| "head"| "post" | "put" | "patch" | "delete" | "connect" | "options" | "trace"
    //      请求路径 注意参数的标签为path时的呼应 /:id1/:id2...
    //      请求体、响应体可以为空 为空时可以去除括号
    service demo-api {
        @doc(
            summary: "信息获取"
        )
        @handler GetInfoHandler
        post /Info/get (GetInfoReq) returns (GetInfoResp)
    }
    
  2. 执行goctl命令

 goctl api go -api ./api/demo.api -dir . -style gozero
  1. 执行结果
    在这里插入图片描述
    其中:
    etc:静态配置文件目录
    demo.go:程序启动入口文件
    internal:单个服务内部文件,其可见范围仅限当前服务
    config:静态配置文件对应的结构体声明目录
    handler:handler 目录,可选,一般 http 服务会有这一层做路由管理,handler 为固定后缀
    logic:业务目录,所有业务编码文件都存放在这个目录下面,logic 为固定后缀
    svc:依赖注入目录,所有 logic 层需要用到的依赖都要在这里进行显式注入
    types:结构体存放目录

  2. 接下来你只需要负责logic的具体实现就可以了,当前你也可以对生成的内容进行修改


http://www.kler.cn/a/525114.html

相关文章:

  • NLP模型大对比:Transformer > RNN > n-gram
  • 使用kitty terminal遇到的‘xterm-kitty‘: unknown terminal type.
  • 多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新——从DeepSeek看下一代语言模型的高效之路
  • 8639 折半插入排序
  • 十年筑梦,再创鲸彩!庆祝和鲸科技十周年
  • python——Django 框架
  • Pyside的QWebEngineProfile类
  • OpenLayers知识总结1
  • 在Putty创建php文件
  • 安卓通过网络获取位置的方法
  • 透视B/S架构与C/S架构:构建未来网络应用的智慧选择
  • C27.【C++ Cont】时间、空间限制和STL库的简单了解
  • 跨境电商代购系统独立站深度分享
  • 【信息系统项目管理师-选择真题】2006下半年综合知识答案和详解
  • TVS选型设计
  • Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓
  • 【Rust自学】17.1. Rust的面向对象的编程特性
  • EtherCAT主站IGH-- 20 -- IGH之fsm_pdo_entry.h/c文件解析
  • 【重生之我在学习C语言编译与链接详解】
  • ue5笔记(2)
  • OSCP:发送钓鱼电子邮件执行客户端攻击
  • Java面试题2025-并发编程进阶(线程池和并发容器类)
  • DeepSeek:硅谷AI格局的拐点?
  • 基于STM32的自主行驶无人小车教学
  • ping命令详解Type 8和0 或者Type 3
  • 提升RAG效果:为何 JSON 格式远胜 Markdown?