/
idalynnn
/
api
Обзор
Документация
Войти
/
idalynnn
/
api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lab4/client/Program.cs
90 строк
3 KB
idalynnn
logs
16 дек 2025, 16:36
16 дек 2025, 16:36
567b48c
Код
Авторство
О чём код?
using System.Text; using System.Text.Json; using RabbitMQ.Client; using RabbitMQ.Client.Events; const string ApiKey = "lab4-secret-key"; const string RequestsQueue = "api.requests"; var factory = new ConnectionFactory { HostName = "localhost", UserName = "guest", Password = "guest" }; using var conn = factory.CreateConnection(); using var ch = conn.CreateModel(); // reply очередь для конкретного клиента var replyQueue = ch.QueueDeclare(queue: "", durable: false, exclusive: true, autoDelete: true).QueueName; var consumer = new EventingBasicConsumer(ch); var responses = new Dictionary<string, string>(); consumer.Received += (_, ea) => { var corr = ea.BasicProperties.CorrelationId; var msg = Encoding.UTF8.GetString(ea.Body.ToArray()); responses[corr] = msg; }; ch.BasicConsume(replyQueue, autoAck: true, consumer: consumer); Console.WriteLine("Client started.\n"); var projectId = await Call("v1", "create_project", new { name = "My Project" }); var pid = projectId?.GetProperty("Id").GetInt32() ?? 1; for (int i = 0; i < 30; i++) { await Call("v1", "create_task", new { projectId = pid, title = $"Task #{i}", completed = false }); } await Call("v1", "list_tasks", new { }); Console.WriteLine("\nDone."); async Task<JsonElement?> Call(string version, string action, object data) { var req = new ApiRequest { Id = Guid.NewGuid().ToString(), Version = version, Action = action, Data = data, Auth = ApiKey }; var props = ch.CreateBasicProperties(); props.CorrelationId = req.Id; props.ReplyTo = replyQueue; props.Persistent = true; var json = JsonSerializer.Serialize(req); var bytes = Encoding.UTF8.GetBytes(json); ch.BasicPublish(exchange: "", routingKey: RequestsQueue, basicProperties: props, body: bytes); // ждём ответ по correlation_id var timeoutMs = 5000; var waited = 0; while (waited < timeoutMs) { if (responses.TryGetValue(req.Id, out var respJson)) { var resp = JsonSerializer.Deserialize<ApiResponse>(respJson); Console.WriteLine($"action={action} status={resp?.Status}"); Console.WriteLine(respJson); Console.WriteLine(new string('-', 60)); var doc = JsonDocument.Parse(respJson); return doc.RootElement.TryGetProperty("data", out var d) ? d : null; } await Task.Delay(50); waited += 50; } Console.WriteLine($"Timeout waiting response for {action}"); return null; }