Добрый день
Я новичок в API. Я использовал их, но до сих пор мне не приходилось публиковать свои собственные.
Я хотел бы иметь единообразие во всех ответах на ошибки. Я хотел бы, чтобы все мои ответы (кроме диапазона 200) выглядели так же, как ответ об ошибке по умолчанию, но когда я добавляю свою собственную ошибку, в Postman возвращается только моя ошибка.
Например, когда требуемый параметр не передается, тело ответа по умолчанию выглядит следующим образом:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-118adfb731bbdb32e865873f70487da2-f5994dea1e69866a-00",
"errors": {
"Spec": [
"The Spec field is required."
]
}
}
Обратите внимание, что я не проверяю поля и не генерирую вышеуказанное сообщение об ошибке.
Когда я возвращаю ответ BadRequest(), в Postman я вижу тело ответа, также содержащее тип, статус, заголовок и идентификатор трассировки:
API:
public async Task<ActionResult> GetList([FromQuery] SearchCriteria criteria)
{
return BadRequest();
}
Ответ:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"traceId":
}
НО, когда я добавляю сообщение об ошибке, в Postman возвращается только мое сообщение об ошибке:
API:
public async Task<ActionResult> GetList([FromQuery] SearchCriteria criteria)
{
return BadRequest(error: new { error = "Unable to return list" });
}
Ответ:
{
"error": "Unable to return list"
}
Как я могу добавить свое собственное сообщение об ошибке, а также указать тип, заголовок, статус и идентификатор трассировки в ответе, чтобы пользователь всегда знал, чего ожидать?
Заранее спасибо.
Вы должны вернуть JsonResult
с пользовательским классом
JsonResult
имеет свойство StatusCode
, которое вы можете установить
// model to return to client side
private class ReturnModel
{
public string? message { get; set; }
...
}
// in controller method
return new JsonResult(new ReturnModel
{
message = "..."
})
{
StatusCode = (int)HttpStatusCode.BadRequest
};
Нет, весь смысл «проблемного JSON» в том, что это стандартизированный способ возврата ответов об ошибках, и вам не нужно создавать свои собственные модели ответов.
@CodeCaster хорошо, если вы знаете альтернативное решение, почему бы вам не опубликовать его?
Потому что я на мобильном телефоне и не могу так быстро найти дубликат.
@Codingwiz Спасибо. На самом деле я думал о создании собственного тела, которое имитирует тело ответа по умолчанию. Но, похоже, я смогу использовать ProblemDetailsFactory для достижения ожидаемого результата.
Вероятно, самым простым подходом будет использование ValidationProblem
:
ModelState.AddModelError("return", "Unable to return List");
return ValidationProblem(ModelState);
Что дает мне следующий ответ:
{
"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title":"One or more validation errors occurred.",
"status":400,
"traceId":"00-4091c0b6419e8cc5d4e9cb1da3764f11-d2bc593ce1a51e0a-00",
"errors":{
"return":[
"Unable to return List"
]
}
}
В противном случае вам, возможно, придется побаловаться с методами, предоставляемыми ProblemDetailsFactory.
Спасибо, это то, что я искал. Только жаль, что заголовок всегда будет "Произошла одна или несколько ошибок проверки". когда я также хотел бы использовать это тело ответа для чего-то вроде тайм-аута SQL. Но я также поиграю с ProblemDetailsFactory, как вы предложили.