/
ivanstrike
/
tasker
Обзор
Документация
Войти
/
ivanstrike
/
tasker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab3/Client/Examples/Lab2/Program.cs
188 строк
7 KB
ivanstrike
laba4
21 дек 2025, 21:13
21 дек 2025, 21:13
e9bb9a2
Код
Авторство
О чём код?
using TaskApiClient; using TaskApiClient.Models; Console.WriteLine("=== Task API Client - Примеры для Lab2 (API v3) ===\n"); // Вариант 1: Использование X-API-Key без JWT Console.WriteLine("--- Вариант 1: Авторизация через X-API-Key ---\n"); var apiKeyClient = new TaskApiClient.TaskApiClient( "http://localhost:8001", apiKey: "public-api-key-123" ); try { // 1. Получение проектов с API-ключом Console.WriteLine("1. Получение проектов (только id и name)..."); var projectsResponse = await apiKeyClient.GetProjectsV3Async( offset: 0, limit: 5, include: "id,name" ); if (projectsResponse.IsSuccess) { Console.WriteLine($"✓ Найдено проектов: {projectsResponse.Data!.Count}"); if (projectsResponse.Headers.TryGetValue("X-Total-Count", out var totalCount)) Console.WriteLine($" X-Total-Count: {totalCount}"); foreach (var project in projectsResponse.Data.Take(3)) { Console.WriteLine($" - [{project.Id}] {project.Name}"); } } else { Console.WriteLine($"✗ Ошибка: {projectsResponse.ErrorMessage}"); } // 2. Получение задач с API-ключом Console.WriteLine("\n2. Получение задач (все поля)..."); var tasksResponse = await apiKeyClient.GetTasksV3Async( offset: 0, limit: 5 ); if (tasksResponse.IsSuccess) { Console.WriteLine($"✓ Найдено задач: {tasksResponse.Data!.Count}"); foreach (var task in tasksResponse.Data.Take(3)) { Console.WriteLine($" - [{task.Id}] {task.Title}"); Console.WriteLine($" Status: {task.Status}, Priority: {task.Priority}"); } } else { Console.WriteLine($"✗ Ошибка: {tasksResponse.ErrorMessage}"); } // 3. Sparse fieldsets - только нужные поля Console.WriteLine("\n3. Получение задач (только id, title, status)..."); var sparseTasksResponse = await apiKeyClient.GetTasksV3Async( offset: 0, limit: 5, include: "id,title,status" ); if (sparseTasksResponse.IsSuccess) { Console.WriteLine($"✓ Получено задач: {sparseTasksResponse.Data!.Count}"); foreach (var task in sparseTasksResponse.Data.Take(3)) { Console.WriteLine($" - [{task.Id}] {task.Title} [{task.Status}]"); Console.WriteLine($" Priority: {task.Priority ?? "не включено"}"); } } // 4. Пагинация Console.WriteLine("\n4. Пагинация (offset=2, limit=3)..."); var paginatedResponse = await apiKeyClient.GetTasksV3Async( offset: 2, limit: 3, include: "id,title" ); if (paginatedResponse.IsSuccess) { Console.WriteLine($"✓ Задачи со 2-й позиции:"); foreach (var task in paginatedResponse.Data!) { Console.WriteLine($" - [{task.Id}] {task.Title}"); } } // 8. Демонстрация sparse fieldsets Console.WriteLine("\n8. Демонстрация sparse fieldsets с разными комбинациями..."); Console.WriteLine(" Примечание: API возвращает только запрошенные поля."); Console.WriteLine(" Незапрошенные поля будут null в C# объекте.\n"); var fieldCombinations = new[] { ("id,title", "только ID и название"), ("id,status", "ID и статус"), ("title,status,priority", "название, статус и приоритет (без ID)") }; foreach (var (fields, description) in fieldCombinations) { Console.WriteLine($" include={fields} ({description}):"); var sparseResponse = await apiKeyClient.GetTasksV3Async(0, 1, fields); if (sparseResponse.IsSuccess && sparseResponse.Data!.Count > 0) { var task = sparseResponse.Data.First(); var hasId = task.Id.HasValue; var hasTitle = !string.IsNullOrEmpty(task.Title); var hasStatus = !string.IsNullOrEmpty(task.Status); var hasPriority = !string.IsNullOrEmpty(task.Priority); Console.WriteLine($" ✓ ID: {(hasId ? task.Id.ToString() : "null (не запрошено)")}"); Console.WriteLine($" ✓ Title: {(hasTitle ? task.Title : "null (не запрошено)")}"); Console.WriteLine($" ✓ Status: {(hasStatus ? task.Status : "null (не запрошено)")}"); Console.WriteLine($" ✓ Priority: {(hasPriority ? task.Priority : "null (не запрошено)")}\n"); } } } finally { apiKeyClient.Dispose(); } Console.WriteLine("\n\n--- Вариант 2: Авторизация через JWT (Bearer Token) ---\n"); var jwtClient = new TaskApiClient.TaskApiClient("http://localhost:8001"); try { // 5. Получение токена для v3 Console.WriteLine("5. Получение JWT токена (username=demo)..."); var tokenResponse = await jwtClient.GetTokenV3Async("demo"); if (tokenResponse.IsSuccess) { Console.WriteLine($"✓ Токен получен!"); Console.WriteLine($" Token: {tokenResponse.Data!.AccessToken[..20]}..."); Console.WriteLine($" Type: {tokenResponse.Data.TokenType}"); } else { Console.WriteLine($"✗ Ошибка: {tokenResponse.ErrorMessage}"); return; } // 6. Использование JWT для получения данных Console.WriteLine("\n6. Получение проектов с JWT токеном..."); var jwtProjectsResponse = await jwtClient.GetProjectsV3Async( offset: 0, limit: 10, include: "id,name,description" ); if (jwtProjectsResponse.IsSuccess) { Console.WriteLine($"✓ Найдено проектов: {jwtProjectsResponse.Data!.Count}"); Console.WriteLine($" Rate Limit: {jwtClient.RateLimit.Remaining} запросов осталось"); foreach (var project in jwtProjectsResponse.Data.Take(3)) { Console.WriteLine($" - [{project.Id}] {project.Name}"); if (!string.IsNullOrEmpty(project.Description)) Console.WriteLine($" Описание: {project.Description}"); } } // 7. Проверка rate limiting Console.WriteLine("\n7. Информация о Rate Limiting:"); Console.WriteLine($" Осталось запросов: {jwtClient.RateLimit.Remaining}"); Console.WriteLine($" Retry-After: {jwtClient.RateLimit.RetryAfter} сек"); } finally { jwtClient.Dispose(); }