KodySu.Client
1.0.1
dotnet add package KodySu.Client --version 1.0.1
NuGet\Install-Package KodySu.Client -Version 1.0.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="KodySu.Client" Version="1.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="KodySu.Client" Version="1.0.1" />
<PackageReference Include="KodySu.Client" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add KodySu.Client --version 1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: KodySu.Client, 1.0.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package KodySu.Client@1.0.1
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=KodySu.Client&version=1.0.1
#tool nuget:?package=KodySu.Client&version=1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
KodySu.Client
Типобезопасный .NET клиент для работы с KodySu API v2.1 с поддержкой кеширования.
Особенности
- Типобезопасность - используются strongly typed модели вместо магических строк
- Надежность - политики повтора (retry), circuit breaker для обработки сбоев
- HTTP-кеширование - прозрачное кеширование ответов API (10 минут TTL)
- Мульти-таргетинг - поддержка .NET 6.0, 8.0 и 9.0
- Логирование - структурированное логирование всех операций
- Конфигурируемость - настройка через appsettings.json или код
- DI интеграция - готовые расширения для ASP.NET Core
Установка
dotnet add package KodySu.Client
Быстрый старт
1. Регистрация в DI контейнере
// Базовый клиент без кеширования
services.AddKodySuClient(Configuration);
// Кешированный клиент (рекомендуется)
services.AddCachedKodySuClient(Configuration);
2. Конфигурация через appsettings.json
{
"KodySuOptions": {
"ApiKey": "your-api-key",
"TimeoutSeconds": 30
}
}
3. Использование
public class PhoneService
{
private readonly IKodySuClient _kodySuClient;
public PhoneService(IKodySuClient kodySuClient)
{
_kodySuClient = kodySuClient;
}
public async Task<string> GetOperatorAsync(string phoneNumber)
{
var result = await _kodySuClient.SearchPhoneAsync(phoneNumber);
if (result?.Success == true)
{
return result.Operator ?? "Неизвестный оператор";
}
return "Номер не найден";
}
public async Task<IReadOnlyList<KodySuResult>> SearchMultipleAsync(
IEnumerable<string> phoneNumbers)
{
return await _kodySuClient.SearchPhonesAsync(phoneNumbers);
}
}
Структура проекта
├── IKodySuClient.cs # Интерфейс клиента
├── KodySuClientBase.cs # Базовый класс с общей функциональностью
├── KodySuClient.cs # Основная реализация HTTP клиента
├── CachedKodySuClient.cs # Реализация с HTTP-кэшированием
├── KodySuServiceCollectionExtensions.cs # Регистрация в DI
├── KodySuClientOptions.cs # Настройки клиента
├── KodySuHttpResponseHandler.cs # Обработчик HTTP ответов
├── KodySuResult.cs # Модель результата поиска
├── KodySuSearchResponse.cs # Модель ответа API
├── KodySuPhoneType.cs # Перечисление типов номеров
├── KodySuExceptions.cs # Исключения клиента
├── KodySuErrorCodes.cs # Коды ошибок API
└── PhoneNumber.cs # Модель телефонного номера
Конфигурация
Опции клиента
public class KodySuClientOptions : HttpClientOptions
{
public string ApiKey { get; set; } = string.Empty;
public int CacheExpiryMinutes { get; set; } = 60;
// Унаследованные настройки:
// public string BaseUrl { get; set; } = "https://www.kody.su";
// public int TimeoutSeconds { get; set; } = 30;
// public string UserAgent { get; set; } = "Planfact-KodySu-Client/1.0";
}
Расширенная конфигурация
{
"KodySuOptions": {
"ApiKey": "your-api-key",
"BaseUrl": "https://www.kody.su",
"TimeoutSeconds": 60,
"UserAgent": "MyApp-KodySu-Client/1.0",
"CacheExpiryMinutes": 60
}
}
Модели данных
KodySuResult
public class KodySuResult
{
public string PhoneNumber { get; set; }
public bool Success { get; set; }
public string? Operator { get; set; }
public string? OperatorFull { get; set; }
public string? Country { get; set; }
public string? City { get; set; }
public string? DefCode { get; set; }
// ... другие свойства
}
Типы номеров
public enum KodySuPhoneType
{
RussianMobile,
RussianFixed,
Other
}
Кеширование
Кешированный клиент (CachedKodySuClient
) автоматически кеширует ответы API:
- TTL: 10 минут (MediumTerm preset)
- Размер кеша: 1,000 записей
- Автоматическое управление: очистка старых записей
- Прозрачность: кеширование на уровне HTTP ответов
Обработка ошибок
Клиент использует типизированные исключения для различных типов ошибок:
try
{
var result = await _kodySuClient.SearchPhoneAsync("+79001234567");
}
catch (KodySuAuthenticationException ex)
{
// Ошибки аутентификации (401, 403)
Console.WriteLine($"Проблемы с API ключом: {ex.Message}");
}
catch (KodySuValidationException ex)
{
// Ошибки валидации от API
Console.WriteLine($"Ошибка валидации: {ex.ErrorCode} - {ex.Message}");
}
catch (KodySuHttpException ex)
{
// Прочие HTTP ошибки
Console.WriteLine($"HTTP ошибка: {ex.StatusCode}");
}
Автоматические политики надежности
- Retry: автоматические повторы при транзиентных ошибках
- Circuit Breaker: защита от каскадных сбоев
- Rate Limiting: обработка ответов 429 (Too Many Requests)
Тестирование и покрытие кода
Проект имеет высокое покрытие unit тестами:
- 58 unit тестов - полное покрытие основной функциональности
- Кроссплатформенное тестирование - macOS, Ubuntu, Windows
- Мокирование HTTP - тесты не зависят от внешних сервисов
- Автоматическое покрытие - интеграция с Codecov
Запуск тестов локально
# Обычный запуск тестов
dotnet test
# Запуск с генерацией HTML отчета о покрытии
./coverage.sh
После выполнения ./coverage.sh
откройте ./CoverageReport/index.html
в браузере для просмотра детального отчета.
Лицензия
Этот проект лицензирован под MIT License.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net6.0
- Microsoft.Extensions.Http (>= 9.0.8)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.8)
- Reliable.HttpClient (>= 1.0.0)
- Reliable.HttpClient.Caching (>= 1.0.2)
-
net8.0
- Microsoft.Extensions.Http (>= 9.0.8)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.8)
- Reliable.HttpClient (>= 1.0.0)
- Reliable.HttpClient.Caching (>= 1.0.2)
-
net9.0
- Microsoft.Extensions.Http (>= 9.0.8)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.8)
- Reliable.HttpClient (>= 1.0.0)
- Reliable.HttpClient.Caching (>= 1.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.