论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Go-Zero界说API实战:探索API语法规范与最佳实践(五) ...
Go-Zero界说API实战:探索API语法规范与最佳实践(五)
宝塔山
金牌会员
|
2024-5-20 03:10:36
|
显示全部楼层
|
阅读模式
楼主
主题
873
|
帖子
873
|
积分
2619
前言
上一篇文章带你实现了
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校验见效了
路由规则
路由必须以 / 开头 2. 路由节点必须以 / 分隔
路由节点中可以包含 :,但是 : 必须是路由节点的第一个字符,: 背面的节点值必须要在结请求体中有 path tag 声明,用于接收路由参数,详细规则可参考
路由参数
。 4. 路由节点可以包含字母、数字(goctl 1.5.1 支持,可参考
新版 API 解析器使用
)、下划线、中划线
参数规则
接收规则说明见效范围示例jsonjson 序列化请求体&响应体json:"foo"path路由参数请求体path:"id"formpost 请求的表单(支持 content-type 为 form-data 和 x-www-form-urlencoded) 参数请求接收标识,get 请求的 query 参数接收标识请求体form:"name"headerhttp 请求体接收标识请求体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语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
宝塔山
金牌会员
这个人很懒什么都没写!
楼主热帖
Sqlserver2012卸载
分布式事务 | 使用DTM 的Saga 模式 ...
哈工大信息安全概论期末复习 ...
Maxwell 一款简单易上手的实时抓取Mysq ...
WebLogic JNDI注入(CVE-2021-2109) ...
数字IC-1.9 吃透通信协议中状态机的代 ...
php微信自定义分享链接,标题,描述, ...
C站 APP 搜索工具使用体验与对比 ...
Redis监控指标
【K哥爬虫普法】你很会写爬虫吗?10秒 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表