gpt4 book ai didi

go - Go 中的错误处理在 http 响应中返回空错误对象

转载 作者:IT王子 更新时间:2023-10-29 02:27:39 25 4
gpt4 key购买 nike

我正在 go 中创建 API。一切正常,只是当出现错误时我想将其显示给用户。我正在使用 go 的 errors 包。

下面是示例代码:

type ErrorResponse struct {
Status string `json:"status"`
Error error `json:"error"`
}
err := errors.New("Total Price cannot be a negative value")
errRes := ErrorResponse{"ERROR", err}
response, errr := json.Marshal(errRes)
if errr != nil {
log.Fatal(err)
return
}
io.WriteString(w, string(response))

我得到的响应是:

{
"status": "ERROR",
"error": {} //why is this empty
}

错误键应该有字符串Total Price 不能是负值。我不明白这个问题。

最佳答案

错误类型无法将自身编码为 JSON。有几种方法可以解决这个问题。如果您不想更改您的 ErrorResponse 结构,那么几乎唯一的方法是为您的结构定义一个自定义的 MarshalJSON 方法,告诉编码(marshal)拆收器使用字符串由错误的 .Error() 方法返回。

func (resp ErrorResponse) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
Status string `json:"status"`
Error string `json:"error"`
}{
Status: resp.Status,
Error: resp.Error.Error(),
})
}

https://play.golang.org/p/EgVj_4Cc3W

如果您还想将错误编码到其他地方的 JSON 中。然后您可以使用自定义错误类型并为其定义编码(marshal)处理,例如:

type MyError struct {
Error error
}

func (err MyError) MarshalJSON() ([]byte, error) {
return json.Marshal(err.Error.Error())
}

https://play.golang.org/p/sjOHj9X0tO

最简单(也可能是最好)的方法是在您的响应结构中使用一个字符串。这是有道理的,因为你在 http 响应中发送的实际值显然是一个字符串,而不是错误接口(interface)。

type ErrorResponse struct {
Status string `json:"status"`
Error string `json:"error"`
}
err := errors.New("Total Price cannot be a negative value")
errRes := ErrorResponse{"ERROR", err.Error()}
response, errr := json.Marshal(errRes)
if errr != nil {
log.Fatal(err)
// you should write something to responseWriter w here before returning
http.Error(w, "Internal server error", http.StatusInternalServerError)
return
}
io.WriteString(w, string(response))

请注意,如果编码(marshal)处理失败,您仍然应该在返回之前写一些响应。

关于go - Go 中的错误处理在 http 响应中返回空错误对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130349/

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