【发布时间】:2020-04-23 13:21:27
【问题描述】:
我编写了这个小 api,我正在使用验证器来验证请求字段,并且我在响应中传播错误而不是错误代码,我希望能够添加自定义错误消息并分配特定的状态代码。例如:如果传递了不正确的类型,我想发消息说已经传递了不正确的类型,状态码为 400,所需的缺失字段为 422,内部服务器错误为 500。我正在努力实现这一点。任何帮助将不胜感激。
type Trade struct {
ClientTradeId string `json:"client_trade_id" validate:"nonzero"`
Date int `json:"date" validate:"nonzero, min=20010101, max=21000101"`
Quantity string `json:"quantity" validate:"nonzero, regexp=^[-]?[0-9]*\\.?[0-9]+$"`
Price string `json:"price" validate:"nonnil, nonzero, regexp=^[-]?[0-9]*\\.?[0-9]+$"`
Ticker string `json:"ticker" validate:"nonzero, nonnil"`
}
type InternalTrade struct {
Id string `json:"Id" validate:"nonzero"`
Trade *Trade `json:"Trade"`
}
type TradeSubmitted struct {
TradeId string `json:"TradeId" validate:"nonzero"`
ClientTradeId string `json:"clientTradeId" validate:"nonzero"`
}
type Error struct {
Message string `json:"Message"`
}
var trades []InternalTrade
var (
tradeValidator = validator.NewValidator()
)
func createTrade(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var trade Trade
var tradeSubmitted TradeSubmitted
json.NewDecoder(r.Body).Decode(&trade)
if errs := tradeValidator.Validate(trade); errs != nil {
json.NewEncoder(w).Encode(errs)
return
}
internal := InternalTrade{
Id: strconv.Itoa(rand.Intn(1000000)),
Trade: &trade,
}
tradeSubmitted.ClientTradeId = trade.ClientTradeId
tradeSubmitted.TradeId = internal.Id
trades = append(trades, internal)
json.NewEncoder(w).Encode(&tradeSubmitted)
}
【问题讨论】:
-
请参阅golang.org/pkg/net/http/#ResponseWriter 文档中的所有内容
-
文档提供了函数来捕获错误,但没有提供如何自定义消息并将消息返回响应,除非我在文档中遗漏了它?
-
@dmc94:
WriteHeader(statusCode int)- 它在 Vorspring 明确链接到的Responsewriter的文档中。整个界面只有三个方法,那么您查看链接文档的难度如何? -
@dmc94: *"add a custom error message" - HTTP 中的状态信息没有实际意义,整个意义来自状态码。
-
您可以使用
http.Error()函数返回带有错误消息的HTTP 状态代码。如果您想要“更自定义”的错误响应(例如 JSON 错误消息),请设置正确的内容类型,然后使用ResponseWriter.WriteHeader()并手动组装您的自定义响应正文。
标签: go