День 2215. #ЗаметкиНаПолях
Создаём Надёжных Клиентов API с Refit. Окончание
Начало
Продолжение
Обработка HTTP-ответов
Хотя Refit по умолчанию автоматически десериализует ответы в определённые вами типы, бывают случаи, когда требуется больше контроля над HTTP-ответом. Refit предоставляет два варианта для этих сценариев: HttpResponseMessage и ApiResponse<T>. Обновим IBlogApi для использования этих типов:
public interface IBlogApi
{
[Get("/posts/{id}")]
Task<HttpResponseMessage> GetPostRawAsync(int id);
[Get("/posts/{id}")]
Task<ApiResponse<Post>>
GetPostWithMetadataAsync(int id);
[Post("/posts")]
Task<ApiResponse<Post>>
CreatePostAsync([Body] Post post);
}
Рассмотрим, как их использовать.
1. HttpResponseMessage
HttpResponseMessage resp =
await blogApi.GetPostRawAsync(1);
if (resp.IsSuccessStatusCode)
{
var content = await resp.Content
.ReadAsStringAsync();
var post = JsonSerializer
.Deserialize<Post>(content);
// …
}
else
{
Console.WriteLine($"Error: {resp.StatusCode}");
}
Этот подход даёт вам полный контроль над HTTP-ответом. Вы можете получить доступ к кодам состояния, заголовкам и необработанному контенту. Но придётся вручную заниматься десериализацией.
2. ApiResponse<T>
Специфичный для Refit тип, который оборачивает десериализованный контент и метаданные ответа:
var newPost = new Post("New Post", "Content", 1);
ApiResponse<Post> resp = await
blogApi.CreatePostAsync(newPost);
if (resp.IsSuccessStatusCode)
{
var post = resp.Content;
var location = resp.Headers.Location;
Console.WriteLine($"ID: {post.Id}");
Console.WriteLine($"Location: {location}");
}
else
{
Console.WriteLine($"Error: {resp.Error.Content}");
Console.WriteLine($"Status: {resp.StatusCode}");
}
Этот подход позволяет получить доступ к созданному ресурсу, проверить определённые заголовки, такие как Location, и легко обрабатывать ошибки.
Итого
Refit преобразует способ нашего взаимодействия с API в приложениях .NET. Преобразование API в строго типизированный интерфейс упрощает код, повышает безопасность типов и улучшает удобство обслуживания.
Основные преимущества Refit:
- упрощённые вызовы API с автоматической сериализацией и десериализацией;
- гибкая обработка параметров для сложных запросов;
- простое управление заголовками и аутентификацией;
- варианты сериализации JSON для соответствия потребностям проекта;
- детальный контроль над ответами HTTP при необходимости.
Refit устраняет шаблонный код, снижает риск ошибок и позволяет вам сосредоточиться на базовой логике приложения, а не на тонкостях HTTP-коммуникаций. Но помните, что хотя Refit упрощает взаимодействие с API, он не заменяет понимания основных принципов RESTful-коммуникации и HTTP.
Источник: https://www.milanjovanovic.tech/blog/refit-in-dotnet-building-robust-api-clients-in-csharp
>>Click here to continue<<