【问题标题】:How do I assign specific http status codes?如何分配特定的 http 状态代码?
【发布时间】: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


【解决方案1】:

恕我直言,请求验证应始终返回 400。

422 是为不同目的而设计的 - https://www.rfc-editor.org/rfc/rfc4918#section-11.2

11.2。 422 无法处理的实体

422(不可处理实体)状态码表示服务器
了解请求实体的内容类型(因此 a
415(不支持的媒体类型)状态码不合适),
请求实体的语法正确(因此为 400(错误请求)
状态码不合适)但无法处理包含的 指示。例如,如果 XML
请求正文包含格式正确(即语法正确),但
语义错误的 XML 指令。

如果您的请求未通过验证,则表示其语法不正确。

您的验证成功完成后,您可以进行额外的检查,然后您可以返回 422。

但是从不同的角度来看这个问题。

区分 400 和 422 真的那么重要吗?客户端软件(非人类)会从中获益,这现实吗?

我在这里专注于软件,因为人们可以阅读消息并且代码对我们来说是多余的。

让我举个例子说明软件对状态码的正确反应。

可靠的系统应支持不同的错误代码,并区分重试有助于传递消息的情况与重试无用的情况,因为它总是失败(除非我们更改服务器代码)。通过返回 400,我们向客户端提示重试将无济于事。客户端可以在代码中实现分支,500重试请求,400完成执行。

额外的 422 代码会增加任何价值吗?

【讨论】:

  • 这都是很好的信息,我完全同意,但它没有回答问题。
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 2012-02-11
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2018-01-21
  • 1970-01-01
相关资源
最近更新 更多