跳至主要內容

echo 请求和响应

Mr.Lexon大约 1 分钟back-end

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: &param,  
       EventRegRequestBody:   body,  
    }  
  
    res, err := eventService.RegEvent(&params)  
    if err != nil {  
       return handleEventError(err)  
    }  
    return c.JSON(http.StatusOK, res)  
}
上次编辑于:
贡献者: Lexon