构建 API 服务
构建 API 服务
Section titled “构建 API 服务”本节创建一个包含登录和查询个人信息的用户服务。
mkdir user-api && cd user-apigo mod init user-api编写 API DSL
Section titled “编写 API DSL”新建 user.api 文件:
syntax = "v1"
type ( LoginReq { Username string `json:"username"` Password string `json:"password"` }
LoginResp { Token string `json:"token"` }
UserInfoReq { Id int64 `path:"id"` }
UserInfoResp { Id int64 `json:"id"` Username string `json:"username"` Email string `json:"email"` })
service user-api { @handler Login post /user/login (LoginReq) returns (LoginResp)}
service user-api { @server ( jwt: Auth )
@handler GetUserInfo get /user/:id (UserInfoReq) returns (UserInfoResp)}goctl api go -api user.api -dir .go mod tidy生成的目录结构:
user-api/├── etc/│ └── user-api.yaml├── internal/│ ├── config/│ │ └── config.go│ ├── handler/│ │ ├── loginhandler.go│ │ └── getuserinfohandler.go│ ├── logic/│ │ ├── loginlogic.go ← 需要填写│ │ └── getuserinfologic.go ← 需要填写│ ├── svc/│ │ └── servicecontext.go│ └── types/│ └── types.go└── user.go实现登录逻辑
Section titled “实现登录逻辑”打开 internal/logic/loginlogic.go:
func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.LoginResp, err error) { if req.Username != "admin" || req.Password != "secret" { return nil, errors.New("invalid credentials") } return &types.LoginResp{ Token: "mock-jwt-token", }, nil}go run user.go -f etc/user-api.yaml# 登录curl -X POST http://localhost:8888/user/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"secret"}'