Pull to refresh

Comments 7

Самый удобный выглядят Refit\RestEase , строготипизированный , вызов через интерфейс. Думаю удобно делать вызовы между микросервисами если шарнуть библиотеку с интерфейсом между ними.

Вот только атрибуты лишне выглядит, неужели нельзя без атрибутов чтобы /url шел по названию метода? чтобы интерфейс оставался абсолютно чистым

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");

var octocat = await gitHubApi.Post.UpdateUser(new { id = 1, name = "octocat" });

// url https://api.github.com/UpdateUser

var octocat = await gitHubApi.Get.GetUser(new { id = 1 });

// url https://api.github.com/GetUser?id=1

Да и вообще страно что никто не реализовал библиотеку через экспрешены чтобы параметры тоже были строготипизированы

var octocat = await gitHubApi.Post(call => call.UpdateUser(1, "octocat"));

Можно пойти еще дальше, и избавиться от xxxApi-класса.

Будет просто await IOtherService.UpdateUser(...., cancellationToken);

Но вместо ручной имплементации IOtherService, маппинг метода на URL, само обращение, ретраи, логирование, метрики, получение зависимостей, и т.д. — всё это можно сделать кодогенерацией и/или AOP

Правда, теперь это напоминает WCF, а ему уже сколько лет-то. Может, есть что готовенькое и поновее?

Спасибо за статью! Изучу на досуге, что за монстры такие, но все равно продолжу использоваться нативный клиент.

Если бы вы были подписаны на подкаст radiodotnet, то статья бы родилась на много месяцев раньше. Там как раз было обсуждение статьи andrewlock на тему генерации httpClient и refit в том числе.

А можно ссылочку на статью andrewlock про генерацию httpClient и refit?

Честно говоря, так и не понял, какое вообще преимущество дают все эти библиотеки? Экономию кода или хотя бы более чистый синтаксис? Нет, по идее, не дают (генератор из openApi не в счёт, ибо это можно делать, не добавляя лишнего кода собственно в приложение). Как по мне, это просто ещё обёртка для тех, кто любит юзать обёртки. Сравните чистый httpClient:

var client = httpClientFactory.CreateClient("SomeClientName");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", SomeUserToken);

HttpResponseMessage response = await client.GetAsync(SomeEndpointAddress);
//получить данные
var SomeData = await response.Content.ReadFromJsonAsync<SomeDataType>();
//или потом отправить в обратную сторону:
response = await client.PostAsJsonAsync(SomeOtherEndpointAddress, SomeData);

Разве это нуждается в дополнительных упрощаторах/улучшаторах?

Спасибо за комментарий, например Refit и RestEase позволяют достаточно удобно шарить контактом для межсервисного взаимодействия. Достаточно удобно держать вместе с микросервисом библиотеку с Api клиентом, для общения с ним, на моей практике это Refit интерфейс и модельки. Шарить HttpClient не так удобно, получается слишком сильная привязка к реализации. Например в кейсах, когда ваш API поддерживает несколько вариантов авторизации или допустим нужно добавить какой то кастомный хедер, то тут на мой взгляд однозначный лидер Refit, проще отредактировать один конфиг Refit, чем переписывать все реализации с HttpClient.

Sign up to leave a comment.

Articles