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

标签 json go curl serialization go-chi

转到此处,使用 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
知道我要去哪里出错吗?我确实看到日志语句在调用绑定(bind)之前打印出订单状态,所以我知道它不是空/空order实例。

最佳答案

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

关于json - Golang Chi 路由器不呈现响应负载 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62549632/

相关文章:

jquery - 通过 API 的 AJAX Post 请求 - 解析请求参数时发生错误

unit-testing - 如何测试不太可能发生的并发场景?

PHP Magento soap 登录调用返回空 session ID

javascript - 从textarea到div的文本具有有限的宽度和高度

arrays - 在 TypeScript 中将 JSON 文件导入为 const

go - Mac 上 golang 中使用 AF_ROUTE 添加路由

curl - Box API 的基本指南对我不起作用

php - 如何让 PayPal 和 cURL 协同工作?

c# - 用于将 Java 的 JSON 与 C# 相互转换的映射工具

elasticsearch - 同时追加/插入 Elasticsearch