操作流程

创建文件夹与.api文件

创建api目录,执行命令 goctl api -o gobug.api

gobug.api 是文件名称,可根据自己需求进行自定义

编写 .api 文件

go-zero: 我们始终秉承工具大于约定和文档的理念,所以使用 api 模板进行最终文件的生成

  1. info(
  2. title: "bug系统"
  3. desc: "基于go-zero的bug系统"
  4. author: "vogin"
  5. email: "654240315@qq.om"
  6. version: "1.0"
  7. )
  8. type UserRegisterReq {
  9. Username string `json:"username"`
  10. Realname string `json:"realname"`
  11. password string `json:"password"`
  12. Repassword string `json:"repassword"`
  13. Email string `json:"email"`
  14. }
  15. type UserRegisterResp {
  16. UserId string `json:"userId"`
  17. Username string `json:"username"`
  18. Realname string `json:"realname"`
  19. Email string `json:"email"`
  20. }
  21. type UserLoginReq {
  22. username string `form:"username"`
  23. password string `form:"password"`
  24. }
  25. type UserLoginResp {
  26. Id int64 `json:"id"`
  27. Username string `json:"username"`
  28. Realname string `json:"realname"`
  29. Email string `json:"email"`
  30. UserToken
  31. }
  32. type UserToken {
  33. Token string `json:"token"`
  34. RefreshToken string `json:"refresh_token"`
  35. }
  36. type (
  37. UserInfoResp {
  38. Id int64 `json:"id"`
  39. Username string `json:"username"`
  40. Realname string `json:"realname"`
  41. Email string `json:"email"`
  42. }
  43. )
  44. @server (
  45. group: passport
  46. )
  47. service passport_api {
  48. @handler UserRegister
  49. post /user/register(UserRegisterReq) returns (UserRegisterResp)
  50. @handler UserLogin
  51. post /user/login(UserLoginReq) returns (UserLoginResp)
  52. }
  53. @server(
  54. jwt: Auth
  55. group: user
  56. middleware: UserCheck
  57. )
  58. service user_api {
  59. @handler UserInfo
  60. get /user() returns (UserInfoResp)
  61. }
  62. @server(
  63. jwt: Auth
  64. middleware: UserCheck
  65. )
  66. service bug_api {
  67. }
  • service 定义api路由、参数以及返回值
    • @handler 决定文件名称
  • server 一些注解内容
    • jwt: Auth 启动系统jwt验证规则
    • group:将handler统一放在哪个目录下,后面是目录名称
    • middleware:中间件名称

根据api生成数据模板内容

进入 api 文件夹,执行命令:

  1. // goctl api go -api gobug.api -dir . // -> 此方式生成的文件规则默认风格比如 servicecontext.go 没有大小写区分或者下划线
  2. goctl api go -style="go_zero" -api gobug.api -dir . // -> 此方式生成具有下划线风格的文件名,如 service_context.go

运行 api

  1. go run bug_api.go -f etc/bug-api.yaml

注意事项

接收请求

参考文档:https://www.yuque.com/tal-tech/go-zero/ze9i30#fa570de9-2 https://github.com/tal-tech/zero-doc/blob/main/doc/mapping.md

后端根据不同的 Content-Type 接收前端传递的数据,那么api如何实现数据的接收。
是根据结构体中的tag不同,从而达到不同数据类型的接收。

application/json

  1. type request {
  2. ping string `json:"ping"`
  3. }

x-www-form-urlencoded

  1. type request {
  2. ping string `form:"ping"`
  3. }

数据验证

https://github.com/tal-tech/zero-doc/blob/main/doc/mapping.md

如何对前端传递的数据做自动验证

  1. type (
  2. createUserReq struct {
  3. age int8 `json:"age,default=20,range=(12:100]"` // 年龄
  4. name string `json:"name"` // 名字
  5. alias string `json:"alias,optional"` // 别名
  6. sex string `json:"sex,options=male|female"` // 性别
  7. avatar string `json:"avatar,default=default.png"` // 头像
  8. }
  9. createUserRes struct {
  10. success bool `json:"success"` // 是否成功
  11. }
  12. )
  13. service user {
  14. @doc(
  15. summary: 创建订单
  16. )
  17. @handler CreateUserHandler
  18. post /user/add(createUserReq) returns(createUserRes)
  19. }

数据校验有很多种方式,包括以下但不限:

  • age:默认不输入为20,输入则取值范围为(12:100],前开后闭
  • name:必填,不可为空
  • alias:选填,可为空
  • sex:必填,取值为malefemale
  • avatar:选填,默认为default.png

更多参考 unmarshaler_test