echo 请求和响应
大约 1 分钟
echo 请求和响应
构建echo服务路由时,请求和响应的构建需要注意一点,就是所有请求必须基于一个结构体去表示,所有的入参都要使用结构体去表示,那怕只有一个参数,除非是没有参数的get请求。
好处:
首先这样做的好处在于在不看api文档的情况下就可以明确了请求的结构和响应的结构,并且,当其结构入参或者出参的时候需要拓展时,可以通过结构体组合的方式去拓展结构体本身的结构,而不影响原本的请求结构。然后在处理的过程中直接交给Validator去校验参数是否为空。
以下是操作实例:
api包下的请求和响应结构
package api
type FetchEventRegReq struct {
Id int64 `validate:"required"`
}
type FetchEventRegRes struct {
Registrations []Registrations `json:"registrations"`
}
type Registrations struct {
Event RegEvent `json:"event"`
SessionIds []int64 `json:"session_ids"`
}
type RegEvent struct {
ID int64 `json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
Date *Date `json:"date"`
OrganizerId int64 `json:"-"`
Organizer RegOrganizer `json:"organizer" gorm:"-"`
}
type RegOrganizer struct {
ID int64 `json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
}
eventsController具体操作:
package eventsController
import (
"github.com/labstack/echo/v4"
"net/http" "wscmakebygo.com/api" "wscmakebygo.com/internal/apperrors" "wscmakebygo.com/internal/apperrors/eventError" "wscmakebygo.com/internal/model" "wscmakebygo.com/internal/service/eventService")
func EventReg(c echo.Context) error {
var (
attendee model.Attendees
err error
)
//绑定uri param传入的参数
param := api.EventRegRequestParams{
OrgSlug: c.Param("organizerSlug"),
EvSlug: c.Param("eventSlug"),
}
body := new(api.EventRegRequestBody)
value := c.Get("attendee")
attendee, err = attendee.CheckAttendeeType(value)
if err != nil {
return err
}
//绑定body传入的参数
if err = c.Bind(body); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, eventError.INVALID_BODY)
}
// 分别校验
if err = apperrors.ValidateStruct(param, eventError.INVALID_PARAMS); err != nil {
return err
}
if err = apperrors.ValidateStruct(body, eventError.INVALID_BODY); err != nil {
return err
}
//组合进入下一步处理
params := api.EventRegParams{
AttendeeId: attendee.ID,
EventRegRequestParams: ¶m,
EventRegRequestBody: body,
}
res, err := eventService.RegEvent(¶ms)
if err != nil {
return handleEventError(err)
}
return c.JSON(http.StatusOK, res)
}