码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Go-Zero定义API实战:探索API语法规范与最佳实践(五)


    合集 - Go语言学习(21)
    1.Go面经 | 成都Go面试这么卷?卷王介绍:游戏行业 3年经验 20k+2023-08-102.这些负载均衡都解决哪些问题?服务、网关、NGINX2023-10-073.Golang后端大厂面经!2023-10-304.Golang面试题从浅入深高频必刷「2023版」2023-11-065.避免defer陷阱:拆解延迟语句,掌握正确使用方法2023-11-166.听说90%的人都没搞定手撕协程池这道面试题!2023-11-227.数据库面试题从浅入深高频必刷「2024版」2023-12-018.一文搞懂Go GC演进史,讲的太细致了!2023-12-299.据说这道Go面试题90%的人都搞错了!01-2510.那位拿了多个Offer的大佬分享了最新Go面经03-2611.第一次面字节,一面很简单,二面被疯狂拷打!04-0812.心态崩了,约了半个月,就只有3个面试!04-0913.多高的学历才能轻松找到工作?这个热点有点扯吧~04-1814.抢先看!美团、京东、360等大厂面试题解析,技术面试必备。04-2415.Go-Zero从0到1实现微服务项目开发(二)04-2916.阿里实习生:面试阿里其实并没有那么难。05-0617.腾讯互娱面经,希望别凉05-1118.腾讯、阿里、B站最新面经汇总,有的妥妥的凉经。05-13
    19.Go-Zero定义API实战:探索API语法规范与最佳实践(五)05-14
    20.工作卷,是主动选择还是迫于无奈?05-1521.腾讯、阿里、B站最新面经汇总,有的妥妥的凉经05-16
    收起

    前言

    上一篇文章带你实现了Go-Zero模板定制化,本文将继续分享如何使用GO-ZERO进行业务开发。

    通过编写API层,我们能够对外进行接口的暴露,因此学习规范的API层编写姿势是很重要的。

    通过本文的分享,你将能够学习到Go-Zero的API语法规范,以及学会实际上手使用。

    概述

    下文所说的是 api 是 go-zero 自研的领域特性语言(下文称 api 语言 或 api 描述语言),旨在实现人性化的基础描述语言,作为生成 HTTP 服务最基本的描述语言。

    api 领域特性语言包含语法版本、info 块、结构体声明、服务描述等几大块语法组成,其中结构体和 Golang 结构体 语法几乎一样,只是移除了 struct 关键字。

    实战前准备

    首先需要你在本地安装goctl、go-zero,下载教学和地址点击这里,按照教程操作即可,非常简单。

    下面按顺序和我操作吧,对使用模板快速生成API层不清楚的同学务必先看我前篇文章:Go-Zero goctl实战

    这里我假设你已经创建好了一个API服务的demo,且目录结构长这样:

    学习API语法

    对于Go语言开发者来说,Go-Zero的API语法学习和理解成本极低,我们可以很轻松的学会API语法。下面我会为大家介绍重点需要掌握的语法。更详细的语法规范,可以参考官网:API 规范 | go-zero Documentation

    生成API文件

    cd demo  
    goctl api go -api demo.api -dir . -style gozero  
    
    • 基础的API文件

    ID标识符

    golang中的预定义类型、常量、函数,以及关键字在api里面同样适用

    • 预定义
    //预定义类型:  
        any bool byte comparable  
        complex64 complex128 error float32 float64  
        int int8 int16 int32 int64 rune string  
        uint uint8 uint16 uint32 uint64 uintptr  
      
    //预定义常量:  
        true false iota  
      
    //零值:  
        nil  
      
    //预定义函数:  
        append cap close complex copy delete imag len  
        make new panic print println real recover  
    
    • 关键字
    break        default      func         interface    select  
    case         defer        go           map          struct  
    chan         else         goto         package      switch  
    const        fallthrough  if           range        type  
    continue     for          import       return       var  
    

    tip:需要注意的是 goctl api不支持any类型!!!

    类型声明

    规则

    • 类型声明必须以 type 开头
    • 不需要声明 struct关键字
    • 不支持嵌套结构体声明
    • 不支持别名

    示例

    type StructureExample {  
        // 基本数据类型示例  
        BaseInt     int     `json:"base_int"`  
        BaseBool    bool    `json:"base_bool"`  
        BaseString  string  `json:"base_string"`  
        BaseByte    byte    `json:"base_byte"`  
        BaseFloat32 float32 `json:"base_float32"`  
        BaseFloat64 float64 `json:"base_float64"`  
        // 切片示例  
        BaseIntSlice     []int     `json:"base_int_slice"`  
        BaseBoolSlice    []bool    `json:"base_bool_slice"`  
        BaseStringSlice  []string  `json:"base_string_slice"`  
        BaseByteSlice    []byte    `json:"base_byte_slice"`  
        BaseFloat32Slice []float32 `json:"base_float32_slice"`  
        BaseFloat64Slice []float64 `json:"base_float64_slice"`  
        // map 示例  
        BaseMapIntString      map[int]string               `json:"base_map_int_string"`  
        BaseMapStringInt      map[string]int               `json:"base_map_string_int"`  
        BaseMapStringStruct   map[string]*StructureExample `json:"base_map_string_struct"`  
        BaseMapStringIntArray map[string][]int             `json:"base_map_string_int_array"`  
        // 匿名示例  
        *Base  
        // 指针示例  
        Base4 *Base `json:"base4"`  
          
        // 新的特性( goctl >= 1.5.1 版本支持 )  
        // 标签忽略示例  
        TagOmit string  
    }  
    

    路由前缀

    我们可以通过prefix关键字区分路由组

    接着再使用goctl api生成代码以及swagger,将swagger导入apifox查看路由前缀,可以看见就增添了前缀/demo。

    不知道怎么生成api代码的同学可以看我往期的gozero实战分享——go-zero goctl实战

    服务分组

    当我们的业务体量上来后,服务接口也会越来越多,生成的代码文件(handler、logic文件等)也会越来越多。这时候我们就需要对不同的接口按一定的分组进行区分,用文件夹进行隔离,以便于开发和维护。

    • 分组前的目录结构是这样的

    • 我们先将生成的handler和logic文件删除。
    • 只需要在@server语句块里面添加关键字group就能进行分组。分组后的结构如下图所示。

    JWT校验

    • 接下来我们再来看一下api文件中怎么开启jwt认证
    • 在配置文件demo-api.yaml中添加jwt配置

    • 在config文件中添加一个JWT认证需要的密钥和过期时间配置
    JwtAuth struct { // JWT 认证需要的密钥和过期时间配置  
        AccessSecret string  
        AccessExpire int64  
    }  
    

    • 使用方法也很简单,我们在@service语句块中添加jwt关键字,使用Auth即可开启jwt。

    • 通过测试请求我们可以看见返回401没有权限,说明jwt校验生效了

    路由规则

    1. 路由必须以 / 开头 2. 路由节点必须以 / 分隔
    2. 路由节点中可以包含 :,但是 : 必须是路由节点的第一个字符,: 后面的节点值必须要在结请求体中有 path tag 声明,用于接收路由参数,详细规则可参考 路由参数。 4. 路由节点可以包含字母、数字(goctl 1.5.1 支持,可参考 新版 API 解析器使用)、下划线、中划线

    参数规则

    接收规则 说明 生效范围 示例
    json json 序列化 请求体&响应体 json:"foo"
    path 路由参数 请求体 path:"id"
    form post 请求的表单(支持 content-type 为 form-data 和 x-www-form-urlencoded) 参数请求接收标识,get 请求的 query 参数接收标识 请求体 form:"name"
    header http 请求体接收标识 请求体 header:"Content-Length"

    中间件声明

    • 想要使用中间件,可以在@server语句块中使用关键字middleware生成一个中间件模板。
    • TIP:需要注意的是中间件首字母必须大写,否则无法被其他包导入。

    • 在svc包的servicecontext.go中注册中间件

    • 生成的中间件代码如下

    API Import

    • 当我们的业务体量上来后,api文件可能会越来越大,又或者我们有一些公共结构体。如果我们都写在同一个api文件中,那么api文件将会变得非常巨大,不易阅读和维护,这时候就需要拆解api文件,通过import来导入。

    syntax

    • 版本信息,import中的版本信息必须与被import的api版本信息一样。
    • 规范写法
    syntax = "v1"  
    
    • 我们创建一个新的文件demo1.api,并且将分组而写到这个api文件下。
    • 因为我们的请求体和响应体是公共结构体,都写在demo.api下面了,我们通过import "demo.api"就能导入demo.api。

    完整的api文件模板

    syntax = "v1"  
      
    type Request {  
        Name string `path:"name,options=you|me"`  
    }  
      
    type Response {  
        Message string `json:"message"`  
    }  
      
    @server (  
        prefix :/demo  
        group: demo_api  
        jwt: JwtAuth  
        middleware: Demo_middleware  
    )  
    // 分组1的服务  
    service demo-api {  
        @handler DemoHandler  
        post /from (Request) returns (Response)  
    }  
      
    // 分组2的服务  
    @server (  
        prefix :/demo1  
        group: demo_api1  
    )  
    service demo-api {  
        @handler DemoHandler1  
        get /from/:name(Request) returns (Response)  
    }  
    

    总结

    这篇文章详细介绍了如何使用Go-Zero进行API的定义,并进行了实际演示。希望对你有帮助。

    我将继续更新Go-Zero系列文章,如果你对Go语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。

  • 相关阅读:
    echarts
    Java后端面试:MySQL面试篇(底层事务、SQL调优)
    探索Django REST框架构建强大的API
    软件测试 | 当面试时被问到“搭建过测试环境吗”, 身为小白要怎么回答?
    基于N32G45的OLED驱动
    ElementPlus·表单验证
    测试开发日记:python代码调试神器,工作提效利器
    滑动窗口实例3(最大连续1的个数Ⅲ)
    【Vue】如何搭建SPA项目--详细教程
    [深度学习] python基础支持汇总
  • 原文地址:https://www.cnblogs.com/wangzhongyang/p/18191472
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号