Разберём HttpClient: 7 возможностей для аккуратной работы с API!
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
➡️ C# Ready | #шпора
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
• базовый адрес через BaseAddress;
• общие заголовки;
• GET-запросы;
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤5👍4
Крутая статья о том, как подружить C#, .NET MAUI и Rust в одном приложении!
В этой статье:
• Как подключить Rust-код к MAUI-проекту
• Зачем может понадобиться нативная часть внутри C#-приложения
• Как C# и Rust могут вместе работать с графикой через SkiaSharp
➡️ C# Ready | #статья
В этой статье:
• Как подключить Rust-код к MAUI-проекту
• Зачем может понадобиться нативная часть внутри C#-приложения
• Как C# и Rust могут вместе работать с графикой через SkiaSharp
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🔥5
Почему не стоит lock-ать строку или публичный объект?
В C#
Проблема начинается, когда в роли
Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на
Похожая проблема с публичными объектами:
Любой внешний код может взять этот объект и тоже сделать
Надёжнее держать приватный синхронизатор:
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
➡️ C# Ready | #совет
В C#
lock работает по объекту-синхронизатору:lock (sync)
{
// критическая секция
}
Проблема начинается, когда в роли
sync используют строку:lock ("cache")
{
UpdateCache();
}Строки могут интернироваться, то есть одинаковые литералы могут ссылаться на один и тот же объект.
В итоге другой код в приложении тоже может случайно заблокироваться на
"cache":lock ("cache")
{
DoSomethingElse();
}Похожая проблема с публичными объектами:
public object Sync = new();
Любой внешний код может взять этот объект и тоже сделать
lock, создавая странные зависания.Надёжнее держать приватный синхронизатор:
private readonly object _sync = new();
lock (_sync)
{
UpdateCache();
}
Так точка блокировки остаётся внутри класса, и никто снаружи не может случайно вмешаться.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥3
Проверяем срок действия TLS-сертификата!
Нужно быстро понять, когда у сайта закончится HTTPS-сертификат? Соберём простую проверку через openssl: подключимся к серверу, достанем notAfter и посчитаем, сколько дней осталось до истечения.
В этой задаче:
Такую проверку удобно запускать в cron, CI или простом мониторинговом скрипте, чтобы не узнать об истёкшем сертификате от пользователей.
➡️ C# Ready | #задача
Нужно быстро понять, когда у сайта закончится HTTPS-сертификат? Соберём простую проверку через openssl: подключимся к серверу, достанем notAfter и посчитаем, сколько дней осталось до истечения.
В этой задаче:
• Получаем сертификат через openssl s_client;
• Достаём дату окончания через openssl x509;
• Считаем разницу и проверяем порог.
Такую проверку удобно запускать в cron, CI или простом мониторинговом скрипте, чтобы не узнать об истёкшем сертификате от пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥3
Хороший вход в современный C# для начинающих и джунов!
Статья спокойно объясняет, зачем сейчас учить C#, где он применяется и с каких базовых вещей стоит начинать, если хочется двигаться в сторону .NET-разработки.
В статье автор показывает:
• где C# используется в реальных проектах
• какие инструменты нужны на старте
• как подойти к изучению языка без хаоса
➡️ C# Ready | #статья
Статья спокойно объясняет, зачем сейчас учить C#, где он применяется и с каких базовых вещей стоит начинать, если хочется двигаться в сторону .NET-разработки.
В статье автор показывает:
• где C# используется в реальных проектах
• какие инструменты нужны на старте
• как подойти к изучению языка без хаоса
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥2
Пишем парсер query string на C#!
Нужно разобрать строку вида ?page=2&tag=cs&tag=api и получить структуру, где повторяющиеся ключи не перетирают друг друга.
В этой задаче:
Такой маленький парсер полезен для CLI-утилит, тестов и логов.
➡️ C# Ready | #задача
Нужно разобрать строку вида ?page=2&tag=cs&tag=api и получить структуру, где повторяющиеся ключи не перетирают друг друга.
В этой задаче:
• убираем лишний вопросительный знак
• делим строку на пары
• декодируем ключи и значения
Такой маленький парсер полезен для CLI-утилит, тестов и логов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤4👍1
Почему ToDictionary может упасть на обычных данных?
Когда нужно быстро превратить список в словарь, часто используют ToDictionary. Это удобно, пока ключи уникальные.
Например, есть список пользователей и нужно быстро искать их по email.
Код короткий и читаемый. Но он содержит скрытое предположение, что одинаковых email в списке точно нет.
Если из API, CSV или базы прилетят два пользователя с одним ключом, ToDictionary бросит исключение. Он не может сам решить, какой объект оставить.
Если дубли возможны, сначала нужно явно выбрать правило. Например, оставить первый элемент.
Теперь поведение видно прямо в коде. Мы не случайно теряем данные, а осознанно выбираем первый объект для каждого email.
Если важнее оставить последний элемент, правило тоже должно быть явным.
А если нужно сохранить все значения одного ключа, лучше использовать ToLookup.
Lookup похож на словарь, но один ключ может содержать несколько элементов. Это хорошо подходит для тегов, ролей, заказов пользователя и результатов группировки.
Иногда правильнее вообще не чинить дубли в коде, а остановить импорт и показать проблему.
Такой вариант полезен, если email должен быть уникальным по бизнес-правилу. Тогда исключение лучше заменить на понятную ошибку валидации.
Вывод простой. ToDictionary хорош, когда уникальность гарантирована. Если данные приходят извне, сначала реши, что делать с дублями.
В таком случае comparer лучше указать явно.
Без этого можно получить два разных ключа, хотя с точки зрения бизнеса это один и тот же пользователь.
Если данные приходят из внешнего источника, полезно сначала нормализовать ключи.
Но нормализация тоже должна быть осознанной. Для одних полей это правильно, для других можно случайно сломать смысл значения.
➡️ C# Ready | #совет
Когда нужно быстро превратить список в словарь, часто используют ToDictionary. Это удобно, пока ключи уникальные.
Например, есть список пользователей и нужно быстро искать их по email.
var byEmail = users.ToDictionary(u => u.Email);
Код короткий и читаемый. Но он содержит скрытое предположение, что одинаковых email в списке точно нет.
Если из API, CSV или базы прилетят два пользователя с одним ключом, ToDictionary бросит исключение. Он не может сам решить, какой объект оставить.
Если дубли возможны, сначала нужно явно выбрать правило. Например, оставить первый элемент.
var byEmail = users
.GroupBy(u => u.Email)
.ToDictionary(g => g.Key, g => g.First());
Теперь поведение видно прямо в коде. Мы не случайно теряем данные, а осознанно выбираем первый объект для каждого email.
Если важнее оставить последний элемент, правило тоже должно быть явным.
var byEmail = users
.GroupBy(u => u.Email)
.ToDictionary(g => g.Key, g => g.Last());
А если нужно сохранить все значения одного ключа, лучше использовать ToLookup.
var byEmail = users.ToLookup(u => u.Email);
Lookup похож на словарь, но один ключ может содержать несколько элементов. Это хорошо подходит для тегов, ролей, заказов пользователя и результатов группировки.
Иногда правильнее вообще не чинить дубли в коде, а остановить импорт и показать проблему.
var duplicates = users
.GroupBy(u => u.Email)
.Where(g => g.Count() > 1);
Такой вариант полезен, если email должен быть уникальным по бизнес-правилу. Тогда исключение лучше заменить на понятную ошибку валидации.
Вывод простой. ToDictionary хорош, когда уникальность гарантирована. Если данные приходят извне, сначала реши, что делать с дублями.
В таком случае comparer лучше указать явно.
var byEmail = users
.GroupBy(u => u.Email, StringComparer.OrdinalIgnoreCase)
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
Без этого можно получить два разных ключа, хотя с точки зрения бизнеса это один и тот же пользователь.
Если данные приходят из внешнего источника, полезно сначала нормализовать ключи.
var email = user.Email.Trim().ToLowerInvariant();
Но нормализация тоже должна быть осознанной. Для одних полей это правильно, для других можно случайно сломать смысл значения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥3