Golang Chi 路由器未呈现响应负载 JSON
Golang Chi router not rendering response payload 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
知道我哪里出错了吗?我 do 在调用绑定之前看到日志语句打印出订单状态,所以我知道它不是 null/empty order
实例。
render.Bind
is input-only, i.e. for decoding the request payload. Instead use 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))
}
}
}
另请注意,多个结构标记的正确格式是“space 分隔”而不是“逗号分隔”。例如:json:"quantity" gorm:"not null"
是正确的,而 json:"quantity",gorm:"not null"
是错误的。
转到此处使用 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
知道我哪里出错了吗?我 do 在调用绑定之前看到日志语句打印出订单状态,所以我知道它不是 null/empty order
实例。
render.Bind
is input-only, i.e. for decoding the request payload. Instead use 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))
}
}
}
另请注意,多个结构标记的正确格式是“space 分隔”而不是“逗号分隔”。例如:json:"quantity" gorm:"not null"
是正确的,而 json:"quantity",gorm:"not null"
是错误的。