API Import
概述
在 go-zero 中,我们通过 api 语言来声明 HTTP 服务,然后通过 goctl 生成 HTTP 服务代码,在之前我们系统性的介绍了 API 规范。
在 HTTP 服务开发中,我们都是通过 api 描述语言来描述 HTTP 服务,随着业务量的增加,api 文件可能会越来越大,又或者我们有一些公共结构体,如果我们都写在同一个 api 文件中,那么 api文件将变成非常巨大,不易阅读和维护,我们可以通过 api import 来引入其他 api 文件解决这类问题。
api 文件引入
假设我们 HTTP 服务的响应格式统一为如下 json 格式:
{"code": 0,"msg": "success","data": {}}
通过如上 json 可以看出,我们的响应格式中有 code、msg、data 三个字段,其中 code 和 msg 是固定的,data 是可变的,我们可以将其中2个字段 code,msg 抽象出来,定义为一个公共的结构体,然后在其他 api 文件中引入这个结构体。
示例,假设我们有一个用户服务来查询用户信息和修改用户信息,我们可以将 code 和 msg 抽象在 base.api 中,然后 user.api 中复用和定义具体的响应结构体即可。
- base.api
- user.api
syntax = "v1"type Base {Code int `json:"code"`Msg string `json:"msg"`}
syntax = "v1"// 引入 base.api 文件import "base.api"type UserInfoReq {Id int64 `path:"id"`}type UserInfo {Id int64 `path:"id"`Name string `json:"name"`Age int `json:"age"`}type UserInfoResp {Base // Base 为 base.api 中的公共结构体,在 api 描述语言中,没有 package 的概念Data UserInfo `json:"data"`}type UserInfoUpdateReq {Id int64 `json:"id"`UserInfo}type UserInfoUpdateResp {Base}service user {@handler userInfoget /user/info/:id (UserInfoReq) returns (UserInfoResp)@handler userInfoUpdatepost /user/info/update (UserInfoUpdateReq) returns (UserInfoUpdateResp)}
温馨提示
在 api 描述语言中,没有 package 的概念,所以在引入其他 api 文件时,需要使用相对路径,如上面示例中的 import "base.api",如果是在同一个目录下,亦可以使用 import "./base.api"。 import 支持相对路径和绝对路径。
在 api 描述语言中,我们规定将所有 service 语法块声明的 HTTP 服务信息都放在 main api文件中,抽象结构体放在其他 api 文件中,然后在 main api 文件中引入其他 api 文件,这样可以让 main api 文件更加简洁,易于维护,而被引入的 api 文件中不允许出现 service 语法块,否则会报错。
特别注意:api 引入不支持循环引入!!!