學(xué)習(xí)API語法

對于Go語言開發(fā)者來說,Go-Zero的API語法學(xué)習(xí)和理解成本極低,我們可以很輕松的學(xué)會(huì)API語法。下面我會(huì)為大家介紹重點(diǎn)需要掌握的語法。更詳細(xì)的語法規(guī)范,可以參考官網(wǎng):API 規(guī)范 | go-zero Documentation[4]

生成API文件

cd demo  
goctl api go -api demo.api -dir . -style gozero

基礎(chǔ)的API文件

ID標(biāo)識(shí)符

golang中的預(yù)定義類型、常量、函數(shù),以及關(guān)鍵字在api里面同樣適用

//預(yù)定義類型:  
any bool byte comparable
complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr

//預(yù)定義常量:
true false iota

//零值:
nil

//預(yù)定義函數(shù):
append cap close complex copy delete imag len
make new panic print println real recover

關(guān)鍵字

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類型!!!

類型聲明

規(guī)則

示例

type StructureExample {  
// 基本數(shù)據(jù)類型示例
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 版本支持 ) // 標(biāo)簽忽略示例 TagOmit string }

路由前綴

我們可以通過prefix關(guān)鍵字區(qū)分路由組

接著再使用goctl api生成代碼以及swagger,將swagger導(dǎo)入apifox查看路由前綴,可以看見就增添了前綴/demo。

不知道怎么生成api代碼的同學(xué)可以看我往期的gozero實(shí)戰(zhàn)分享——go-zero goctl實(shí)戰(zhàn)[5]

服務(wù)分組

當(dāng)我們的業(yè)務(wù)體量上來后,服務(wù)接口也會(huì)越來越多,生成的代碼文件(handler、logic文件等)也會(huì)越來越多。這時(shí)候我們就需要對不同的接口按一定的分組進(jìn)行區(qū)分,用文件夾進(jìn)行隔離,以便于開發(fā)和維護(hù)。

JWT校驗(yàn)

在config文件中添加一個(gè)JWT認(rèn)證需要的密鑰和過期時(shí)間配置

JwtAuth struct { // JWT 認(rèn)證需要的密鑰和過期時(shí)間配置  
AccessSecret string
AccessExpire int64
}

使用方法也很簡單,我們在@service語句塊中添加jwt關(guān)鍵字,使用Auth即可開啟jwt。

通過測試請求我們可以看見返回401沒有權(quán)限,說明jwt校驗(yàn)生效了

路由規(guī)則

  1. 路由必須以 / 開頭 2. 路由節(jié)點(diǎn)必須以 / 分隔
  2. 路由節(jié)點(diǎn)中可以包含 :,但是 : 必須是路由節(jié)點(diǎn)的第一個(gè)字符,: 后面的節(jié)點(diǎn)值必須要在結(jié)請求體中有 path tag 聲明,用于接收路由參數(shù),詳細(xì)規(guī)則可參考 路由參數(shù)[6]。4. 路由節(jié)點(diǎn)可以包含字母、數(shù)字(goctl 1.5.1 支持,可參考 新版 API 解析器使用[7])、下劃線、中劃線

參數(shù)規(guī)則

接收規(guī)則說明生效范圍示例jsonjson 序列化請求體&響應(yīng)體json:"foo"path路由參數(shù)請求體path:"id"formpost 請求的表單(支持 content-type 為?form-data?和?x-www-form-urlencoded) 參數(shù)請求接收標(biāo)識(shí),get 請求的 query 參數(shù)接收標(biāo)識(shí)請求體form:"name"headerhttp 請求體接收標(biāo)識(shí)請求體header:"Content-Length"

中間件聲明

在svc包的servicecontext.go中注冊中間件

生成的中間件代碼如下

API Import

syntax

syntax = "v1"  

完整的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的服務(wù) service demo-api { @handler DemoHandler post /from (Request) returns (Response) } // 分組2的服務(wù) @server ( prefix :/demo1 group: demo_api1 ) service demo-api { @handler DemoHandler1 get /from/:name(Request) returns (Response) }

總結(jié)

這篇文章詳細(xì)介紹了如何使用Go-Zero進(jìn)行API的定義,并進(jìn)行了實(shí)際演示。希望對你有幫助。

本文章轉(zhuǎn)載微信公眾號(hào)@王中陽

上一篇:

OpenAI API 進(jìn)階使用指南01

下一篇:

NestJS、TypeORM 和 PostgreSQL 項(xiàng)目開發(fā)和數(shù)據(jù)庫遷移完整示例
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)