gpt4 book ai didi

go - 如何使用 google/jsonapi 和 echo 框架返回有效的 jsonapi 响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:27 24 4
gpt4 key购买 nike

下面的代码返回两个连接的 JSON 字符串和一个错误的内容类型 text/plain。应该是application/vnd.api+json

package main

import (
"github.com/google/jsonapi"
"github.com/labstack/echo"
"net/http"
)

type Album struct {
ID int `jsonapi:"primary,albums"`
Name string `jsonapi:"attr,name"`
}

func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
jsonapi.MarshalManyPayload(c.Response(), albumList())
return c.JSON(http.StatusOK, c.Response())
})
e.Logger.Fatal(e.Start(":1323"))
}

func albumList() []*Album {
a1 := Album{123, "allbum1"}
a2 := Album{456, "allbum2"}
albums := []*Album{&a1, &a2}
return albums
}

错误输出(两个连接的 json)。第一个是正确的 jsonapi 结构,我认为第二个与 echo-framework 有关:

{
"data": [
{
"type": "albums",
"id": "123",
"attributes": {
"name": "allbum1"
}
},
{
"type": "albums",
"id": "456",
"attributes": {
"name": "allbum2"
}
}
]
}
{
"Writer": {},
"Status": 200,
"Size": 133,
"Committed": true
}

此代码解决了问题,但看起来很笨拙。我觉得有一种更好的方法可以使用 echo 来促进它。

e.GET("/", func(c echo.Context) error {
var b bytes.Buffer
body := bufio.NewWriter(&b)
err := jsonapi.MarshalManyPayload(body, albumList())
if err != nil {
fmt.Println(err)
}
body.Flush()
return c.JSONBlob(http.StatusOK, b.Bytes())
})

有什么想法吗?

最佳答案

您的代码看起来不错。然而它可以被简化-

var b bytes.Buffer // you could use buffer pool here
err := jsonapi.MarshalManyPayload(&b, albumList())
if err != nil {
return err
}
return c.JSONBlob(http.StatusOK, b.Bytes())

您的想法遵循以下方法:

方法 1 -

c.Response().Header().Set(echo.HeaderContentType, jsonapi.MediaType)
c.Response().WriteHeader(http.StatusOK)
return jsonapi.MarshalManyPayload(c.Response(), albumList())

方法 2 -

var b bytes.Buffer // you could use buffer pool here
err := jsonapi.MarshalManyPayload(&b, albumList())
if err != nil {
return err
}
c.Response().Header().Set(echo.HeaderContentType, jsonapi.MediaType)
c.Response().WriteHeader(http.StatusOK)
_, err := b.WriteTo(c.Response())
return err

关于go - 如何使用 google/jsonapi 和 echo 框架返回有效的 jsonapi 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44515677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com