Как вернуть полное тело ответа BadRequest с моей собственной ошибкой

Добрый день

Я новичок в 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"
}

Как я могу добавить свое собственное сообщение об ошибке, а также указать тип, заголовок, статус и идентификатор трассировки в ответе, чтобы пользователь всегда знал, чего ожидать?

Заранее спасибо.

stackoverflow.com/questions/61247934/…
CodeCaster 13.04.2023 18:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
137
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны вернуть 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 13.04.2023 18:02

@CodeCaster хорошо, если вы знаете альтернативное решение, почему бы вам не опубликовать его?

Codingwiz 13.04.2023 18:07

Потому что я на мобильном телефоне и не могу так быстро найти дубликат.

CodeCaster 13.04.2023 18:11

@Codingwiz Спасибо. На самом деле я думал о создании собственного тела, которое имитирует тело ответа по умолчанию. Но, похоже, я смогу использовать ProblemDetailsFactory для достижения ожидаемого результата.

CSharpDev 14.04.2023 16:36
Ответ принят как подходящий

Вероятно, самым простым подходом будет использование 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, как вы предложили.

CSharpDev 14.04.2023 16:31

Другие вопросы по теме