Как назначить указанные c http коды состояния? - PullRequest
0 голосов
/ 06 января 2020

Я написал этот небольшой API, и я использую валидатор для проверки полей запроса, и я распространяю сообщения об ошибках в ответе, но не коды ошибок, я хотел бы иметь возможность добавить пользовательское сообщение об ошибке и назначить спецификацию c коды состояния. Например: если переданы неправильные типы, я хотел бы сообщить, что были переданы неправильные типы, и код состояния был бы 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)

}

1 Ответ

0 голосов
/ 06 января 2020

ИМХО Запрос проверки всегда должен возвращать 400.

422 предназначен для различного назначения - https://tools.ietf.org/html/rfc4918#section -11,2

11.2. 422 Unprocessable Entity

Код состояния 422 (Unprocessable Entity) означает, что сервер
понимает тип содержимого объекта запроса (следовательно, код состояния
415 (Unsupported Media Type) не подходит), и синтаксис
объекта запроса является правильным (таким образом, код состояния 400 (неверный запрос)
не подходит), но не смог обработать содержащиеся в нем инструкции. Например, это условие ошибки может возникать, если тело запроса XML
содержит правильно сформированные (то есть синтаксически правильные), но
семантически ошибочные, XML инструкции.

Если ваш запрос не прошел проверку, это означает, что его синтаксис неверен.

После успешного завершения проверки вы можете выполнить дополнительные проверки и вернуть 422.

Но посмотрите на это проблема с другой точки зрения.

Неужели так важно различать guish между 400 и 422? Реалистично ли c, что клиентское программное обеспечение (не человеческое) получит от него какие-либо преимущества?

Я сосредоточен на программном обеспечении, потому что люди могут читать сообщения, а коды для нас избыточны.

Позвольте мне привести пример правильной реакции программного обеспечения на код состояния.

Надежные системы должны поддерживать разные коды ошибок и различать guish случаев, когда повторная попытка может помочь доставить сообщение по сравнению со случаями, когда повторная попытка бесполезна, поскольку она всегда дает сбой (если мы не изменим код сервера). Возвращая 400, мы даем подсказку клиенту, что повторная попытка не поможет. Клиент может реализовать переход в коде и повторить запрос для 500 и завершить sh выполнение для 400.

Добавляет ли дополнительный код 422 какое-либо значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...