Golang Chi 路由器不呈现响应负载 JSON

转到此处,使用 Chi 渲染器获取基本的 REST 服务。我有以下结构和功能:


type Order struct {

    OrderId      uuid.UUID         `json:"orderId",gorm:"type:uuid;primary_key;not null;default gen_random_uuid()"`

    Quantity     int               `json:"quantity",gorm:"not null"`

    Status       string            `json:"status",gorm:"not null"`

}


func (o *Order) Bind(r *http.Request) error {

    return nil

}


func (o *Order) Render(w http.ResponseWriter, r *http.Request) error {

    return nil

}


func NewOrdersList(orders []Order) []render.Renderer {

    list := []render.Renderer{}

    for _, order := range orders {

        list = append(list, &order)

    }

    return list

}


func GetOrderByIdHandler() http.HandlerFunc {

    return func(w http.ResponseWriter, r *http.Request) {


        orderId := chi.URLParam(r, "orderId")


        order, err := fetchOrder(orderId)

        if err != nil {

            render.Render(w, r, NewInternalServerError(err))

            return

        }


    log.Info("order status is " + order.Status)


        render.Bind(r, &order)

        return

    }

}

当我运行它并点击调用该GetOrderByIdHandler()函数的端点时,我得到了 200 OK/Success。然而,响应正文中没有 JSON,而我本来期望一个表示“订单”的编组 JSON 有效负载,例如:


{

  "orderId": "12345",

  "quantity": 1,

  "status": "SENT"

}

但是,我的 curl 在响应正文中没有显示任何内容:


$ curl -i -H "Content-Type: application/json" -H "Accept: application/json" -X GET http://localhost:9400/myapp/v1/orders/12345

HTTP/1.1 200 OK

Vary: Origin

Date: Wed, 24 Jun 2020 07:09:30 GMT

Content-Length: 0

知道我要去哪里出错吗?我确实看到日志语句在调用绑定之前打印出订单状态,所以我知道它不是空/空order实例。


慕妹3242003
浏览 106回答 1
1回答

GCT1015

render.Bind仅输入,即用于解码请求有效负载。而是用于render.JSON发送 json 响应。func GetOrderByIdHandler() http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        orderId := chi.URLParam(r, "orderId")        order, err := fetchOrder(orderId)        if err != nil {            render.Render(w, r, NewInternalServerError(err))            return        }        log.Info("order status is " + order.Status)        render.JSON(w, r, order)    }}或者,您也可以使用标准方法:导入encoding/json包,然后像这样使用它:func GetOrderByIdHandler() http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        orderId := chi.URLParam(r, "orderId")        order, err := fetchOrder(orderId)        if err != nil {            render.Render(w, r, NewInternalServerError(err))            return        }        log.Info("order status is " + order.Status)        w.Header().Set("Content-Type", "application/json")        if err := json.NewEncoder(w).Encode(order); err != nil {            render.Render(w, r, NewInternalServerError(err))        }    }}另请注意,多个结构标记的正确格式是“空格分隔”而不是“逗号分隔”。例如:json:"quantity" gorm:"not null"是正确的,而json:"quantity",gorm:"not null"不是。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go