Http
本章介绍HTTP相关请求响应的整个流程。
简介
在http请求响应的过程中,从请求到达服务节点,到流程处理,最后到响应给请求发起者,每一步都会根据需要进行处理。
请求
路由中间件
路由中间件往往在整个请求调用链中起到过滤、拦截、上下文管理的作用,通常用于身份认证等,一般位于请求到达后的第一个位置,处理函数之前。
现在,让我们实现一个简单的身份验证中间件。
examples/pkg/app/user/http/middleware/authcheck.go
import (
"github.com/gin-gonic/gin"
"github.com/keepchen/go-sail/v3/constants"
)
func AuthCheck() gin.HandlerFunc {
return func(c *gin.Context) {
authorization := c.GetHeader("Authorization")
if len(authorization) == 0 {
sail.Response(c).Builder(constants.ErrAuthorizationTokenInvalid, nil).Send()
return
}
uid := parseUserIDFromAuthorization(authorization)
c.Set("userID", uid)
c.Next()
}
}
func parseUserIDFromAuthorization(authorization string) int64 {
// TODO
return int64(123)
}
将其注册到路由中。
examples/pkg/app/user/http/routes/routes.go
import (
"github.com/gin-gonic/gin"
"examples/pkg/app/user/http/middleware"
"examples/pkg/app/user/http/handler"
)
func RegisterRoutes(r *gin.Engine) {
userGroup := r.Group("/user", middleware.AuthCheck())
{
userGroup.GET("info", handler.UserInfo)
}
}
实体
请求实体定义了请求参数的数据结构,将为后续的参数处理提供明确的数据类型。因此,我们建议明确定义它。同时我们还定义了它的扩展验证方法来验证内部数据是否符合要求。
examples/pkg/app/user/http/vo/request/userinforeqvo.go
import (
sailConstants "github.com/keepchen/go-sail/v3/constants"
)
type UserInfoReqVO struct {
ShowDetail bool `json:"showDetail" form:"showDetail" validate:"required" format:"bool" `
WithWalletInfo bool `json:"withWalletInfo" form:"withWalletInfo" validate:"required" format:"bool" `
}
func (v *UserInfoReqVO) Validator() (sailConstants.ICodeType, error) {
return sailConstants.ErrNone, nil
}