Files
PandaX/kit/restfulx/restfulx.go
lixxxww 93d5a562a7 提交kit/restfulx
Signed-off-by: lixxxww <941403820@qq.com>
2024-01-23 12:09:15 +00:00

117 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package restfulx
import (
"encoding/json"
"net/http"
"pandax/kit/biz"
"pandax/kit/logger"
"pandax/kit/model"
"strconv"
"github.com/emicklei/go-restful/v3"
"github.com/gorilla/schema"
)
// 绑定并校验请求结构体参数 结构体添加 例如: validate:"required" validate:"required,gt=10"
func BindJsonAndValid(rc *ReqCtx, data any) {
if err := rc.Request.ReadEntity(data); err != nil {
panic(any(biz.NewBizErr(err.Error())))
}
if err := rc.Validate.Struct(data); err != nil {
panic(any(biz.NewBizErr("传参格式错误:" + err.Error())))
}
}
// BindQuery 绑定查询字符串到
func BindQuery(rc *ReqCtx, data any) {
if err := rc.Request.ReadEntity(data); err != nil {
panic(any(biz.NewBizErr(err.Error())))
}
}
// PathParamsToAny 获取虽有路径中的参数
func PathParamsToAny(rc *ReqCtx, in any) {
vars := make(map[string]any)
for k, v := range rc.Request.PathParameters() {
vars[k] = v
}
marshal, _ := json.Marshal(vars)
err := json.Unmarshal(marshal, in)
biz.ErrIsNil(err, "error get path value encoding unmarshal")
return
}
// QueryParamsToAny 获取所有Query的参数
func QueryParamsToAny(rc *ReqCtx, in any) {
err := rc.Request.Request.ParseForm()
biz.ErrIsNil(err, "error get ParseForm value encoding unmarshal")
decoder := schema.NewDecoder()
err = decoder.Decode(in, rc.Request.Request.Form)
biz.ErrIsNil(err, "error get path value encoding unmarshal")
return
}
// GetPageQueryParam 获取分页参数
func GetPageQueryParam(rc *ReqCtx) *model.PageParam {
return &model.PageParam{PageNum: QueryInt(rc, "pageNum", 1), PageSize: QueryInt(rc, "pageSize", 10)}
}
// QueryInt 获取查询参数中指定参数值并转为int
func QueryInt(rc *ReqCtx, qm string, defaultInt int) int {
qv := rc.Request.QueryParameter(qm)
if qv == "" {
return defaultInt
}
qvi, err := strconv.Atoi(qv)
biz.ErrIsNil(err, "query param not int")
return qvi
}
// QueryParam QueryParam
func QueryParam(rc *ReqCtx, key string) string {
return rc.Request.QueryParameter(key)
}
// PathParamInt 获取路径参数
func PathParamInt(rc *ReqCtx, pm string) int {
value, _ := strconv.Atoi(rc.Request.PathParameter(pm))
return value
}
func PathParam(rc *ReqCtx, pm string) string {
return rc.Request.PathParameter(pm)
}
// 文件下载
func Download(rc *ReqCtx, filename string) {
rc.Response.Header().Add("success", "true")
rc.Response.Header().Set("Content-Length", "-1")
rc.Response.Header().Set("Content-Disposition", "attachment; filename="+filename)
http.ServeFile(
rc.Response.ResponseWriter,
rc.Request.Request, filename)
}
// 返回统一成功结果
func SuccessRes(response *restful.Response, data any) {
response.WriteEntity(model.Success(data))
}
// 返回失败结果集
func ErrorRes(response *restful.Response, err any) {
switch t := err.(type) {
case *biz.BizError:
response.WriteEntity(model.Error(t))
break
case error:
response.WriteEntity(model.ServerError())
logger.Log.Error(t)
break
case string:
response.WriteEntity(model.ServerError())
logger.Log.Error(t)
break
default:
logger.Log.Error(t)
}
}