api语法
api文件就是对这个服务所有api的描述
服务名,函数名,路径,请求方法,请求参数,响应参数
我们以用户管理的两个重要接口为例,去编写它的api文件
type LoginRequest {
UserName string `json:"userName"`
Password string `json:"password"`
}
type Response {
Code int `json:"code"`
Data string `json:"data"`
Msg string `json:"msg"`
}
type UserInfo {
UserName string `json:"userName"`
Addr string `json:"addr"`
Id uint `json:"id"`
}
type UserInfoResponse {
Code int `json:"code"`
Data UserInfo `json:"data"`
Msg string `json:"msg"`
}
service users {
@handler login
post /api/users/login (LoginRequest) returns (Response)
@handler userInfo
get /api/users/info returns (UserInfoResponse)
}
// goctl api go -api v1.api -dir .
通过这个示例,我们发现实际操作起来还是有些问题
- 响应如何封装?
- 统一api前缀
- 用户信息接口应该要进行jwt验证
- api文档
响应封装
不把code,data,msg写在api里面,我们通过封装统一响应
在统一响应里面去加上code data msg
type LoginRequest {
UserName string `json:"userName"`
Password string `json:"password"`
}
type UserInfoResponse {
UserName string `json:"userName"`
Addr string `json:"addr"`
Id uint `json:"id"`
}
service users {
@handler login
post /login (LoginRequest) returns (string)
@handler userInfo
get /info returns (UserInfoResponse)
}
// goctl api go -api v1.api -dir .
在common/response/enter.go中
package response
import (
"github.com/zeromicro/go-zero/rest/httpx"
"net/http"
)
type Body struct {
Code uint32 `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
// Response http返回
func Response(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
if err == nil {
//成功返回
r := &Body{
Code: 0,
Msg: "成功",
Data: resp,
}
httpx.WriteJson(w, http.StatusOK, r)
return
}
//错误返回
errCode := uint32(10086)
// 可以根据错误码,返回具体错误信息
errMsg := "服务器错误"

最低0.47元/天 解锁文章
1966

被折叠的 条评论
为什么被折叠?



