Добавить подробное сообщение в стандартный ответ JSON BadRequest в ASP.NET Core 3.1

В моем приложении ASP.NET Core 3.1 есть контроллер, который в одном из случаев возвращает BadRequest(). По умолчанию он выдает ответ json:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "traceId": "|492dbc28-4cf485d536d40917."
}

Это здорово, но я бы хотел добавить строковое значение detail с конкретным сообщением.

Когда я возвращаю BadRequest("msg"), я получаю простой текст msg.

Когда я делаю это так BadRequest(new { Detail = "msg" }), я получаю ответ в формате json:

{
  "detail": "msg"
}

Что лучше, но я хотел бы также сохранить исходные данные json.

Моя цель - вернуть такой ответ:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "detail": "msg",
  "status": 400,
  "traceId": "|492dbc28-4cf485d536d40917."
}

Есть ли способ добиться этого?


person Sergey Atroshchenko    schedule 07.08.2020    source источник


Ответы (2)


Метод ControllerBase.Problem - это идеально подходит для этого. Вот пример, который дает желаемый ответ:

public IActionResult Post()
{
    // ...

    return Problem("msg", statusCode: (int)HttpStatusCode.BadRequest);
}

Вот пример вывода для полноты:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "detail": "msg",
  "traceId": "|670244a-4707fe3038da8462."
}
person Kirk Larkin    schedule 07.08.2020

Получите данные Json в типизированном объекте и отправьте этот ответ обратно.

class MyClass
{
    public string type { get; set; }
    public string title { get; set; }
    public string status { get; set; }
    public string traceId { get; set; }
    public string detail { get; set; }
}

Преобразуйте данные Json с помощью этого класса Type и добавьте подробное сообщение в поле detail.

var obj = JsonConvert.DeserializeObject<MyClass>(yourJson);
obj.detail = "msg";
person Sh.Imran    schedule 07.08.2020
comment
@Sergey ответ полезный для тебя в любом случае или нет? Ваша работа сделана? - person Sh.Imran; 07.08.2020
comment
Где мне взять yourJson? У меня его нет, он генерируется фреймворком где-то под капотом. - person Sergey Atroshchenko; 07.08.2020
comment
Он бы получил, наверное, от любого ответа API? Не так ли? - person Sh.Imran; 07.08.2020
comment
Нет, это не так. В ответе нет данных, он просто должен вернуть неверный результат запроса. - person Sergey Atroshchenko; 08.08.2020