Содержание
В предыдущей части мы рассмотрели методы, предоставляемые статическими классами Results и TypedResults для работы с ответами на запросы пользователей. На протяжении всей текущей главы мы рассмотрим работу каждого из представленных методов и сгруппируем их по назначению. Начнем, пожалуй, с самых распространенных видов ответов пользователе — отправки текстового содержимого. Отправка текста и JSON в классах Results и TypedResults осуществляется с использованием трех методов, каждый из которых имеет ряд перегруженных версий.
Метод Content класса Results
Метод Content() отправляет пользователю строку, позволяя, при этом задавать кодировку текста. Метод имеет три перегруженные версии:
| Версия метода | Описание параметров |
public static IResult Content (string? content, string? contentType = default, Encoding? contentEncoding = default, int? statusCode = default);
|
|
public static IResult Content (string? content, string? contentType, Encoding? contentEncoding);
|
|
public static IResult Content (string? content, MediaTypeHeaderValue contentType);
|
|
Например, рассмотрим использование метода Content:
app.MapGet("/", () => Results.Content("Привет, мир!"));
здесь мы воспользовались первой версией метода и, при этом, параметры contentType, encoding и statusCode оставили со значениями по умолчанию. Напомню, что раннее, без использования классов Results или TypedResults мы бы столкнулись с проблемой кодировки символов. В данном же случае, сервер вернет нам следующий ответ:
то есть, по умолчанию, значение заголовка Content-Type принимается как "text/plain; charset=utf-8", что избавляет нас лишний раз работать вручную с заголовками ответа.
Метод Text класса Results
Метод Text() работает аналогичным образом с Content() и различается, по сути, только одной версией метода, которая принимает в качестве текста структуру ReadOnlySpan<byte>. В классе Results этот метод выглядит следующим образом:
public static IResult Text (ReadOnlySpan<byte> utf8Content, string? contentType = default, int? statusCode = default);
Метод Json класса Results
Этот метод позволяет сериализовать объект в JSON и отправить её пользователю. Метод имеет две версии:
| Версия метода | Описание параметров |
public static IResult Json (object? data, JsonSerializerOptions? options = default, string? contentType = default, int? statusCode = default);
|
|
public static IResult Json<TValue> (TValue? data, JsonSerializerOptions? options = default, string? contentType = default, int? statusCode = default);
|
Пример использования метода:
app.MapGet("/", () => Results.Json(new {Name = "Джон", Surname = "Доу", Age = 35 }));
Здесь мы использовали только первый параметр метода Json(), а остальные оставили со значениями по умолчанию. В результате получим такой ответ сервера:
Если необходимо использовать какие-то дополнительные настройки сериализации в JSON, то можно вызвать метод следующим образом:
app.MapGet("/", () => Results.Json(new { Name = "Джон", Surname = "Доу", Age = 35 },
new System.Text.Json.JsonSerializerOptions()
{
AllowTrailingCommas = true,
PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase,
WriteIndented = true,
}));
Часто, формат JSON в ответе клиенту используется для отправки сообщений об ошибке. В этом случае, мы можем передать статусный код HTTP:
app.MapGet("/", () => Results.Json(new { Name = "Джон", Surname = "Доу", Age = 35 },
null,
null,
400));
Методы Content, Text и Json в классе TypedResults
Действие методов Content, Text и Json в классе TypedResults аналогично действию этих же методов в классе Results, но, при этом, TypedResults возвращает типизированные объекты. Так, в результате выполнения метода Content возвращается объект Content со следующими свойствами:
Content |
Заголовок Content-Type для ответа. |
Response |
Содержимое ответа. |
Status |
Код состояния HTTP. |
При использовании метода Text может возвращаться два типа ответов: первый — тот же Content, второй — Utf8ContentHttpResult если используется версия метода в котором текст задается в виде ReadOnlySpan<byte>.
При использовании метода Json TypedResult возвращает объект типа Json, который имеет следующие свойства:
Content |
Значение заголовка Content-Type . |
Json |
Параметры сериализатора. |
Status |
Код состояния HTTP. |
Value |
Сериализуемый объект |
Итого
Методы Content, Text и Json классов Results и TypedResults позволяют отправлять пользователю текстовое содержимое. При этом, метод Json сериализует переданный в параметрах метода объект в формат Json и отправляет его в ответе пользователю. Все три метода по умолчанию используют кодировку UTF-8 для заголовка Cotent-Type, что несколько упрощает нам работу, например, при отправке текстовых ответов, содержащих кириллицу.


