为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3242003 2022-06-13 15:21:23
转到此处,使用 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/12345HTTP/1.1 200 OKVary: OriginDate: Wed, 24 Jun 2020 07:09:30 GMTContent-Length: 0知道我要去哪里出错吗?我确实看到日志语句在调用绑定之前打印出订单状态,所以我知道它不是空/空order实例。
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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"不是。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信