135 lines
4.3 KiB
Python
Executable File
135 lines
4.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
Пример клиента для работы с Racing A* Web Service API
|
||
"""
|
||
|
||
import requests
|
||
import json
|
||
import sys
|
||
import os
|
||
|
||
|
||
def solve_map(api_url, map_file):
|
||
"""Решает карту, отправляя её на сервер"""
|
||
|
||
print(f"📂 Загрузка карты из {map_file}...")
|
||
|
||
if not os.path.exists(map_file):
|
||
print(f"❌ Файл {map_file} не найден!")
|
||
return None
|
||
|
||
# Читаем карту
|
||
with open(map_file, 'r') as f:
|
||
map_data = json.load(f)
|
||
|
||
print(f"📡 Отправка запроса на {api_url}/solve...")
|
||
|
||
try:
|
||
# Отправляем запрос
|
||
response = requests.post(
|
||
f'{api_url}/solve',
|
||
json=map_data,
|
||
headers={'Content-Type': 'application/json'}
|
||
)
|
||
|
||
result = response.json()
|
||
|
||
if result['success']:
|
||
stats = result['statistics']
|
||
print(f"\n✅ Решение найдено!")
|
||
print(f" Шагов: {stats['steps']}")
|
||
print(f" Чекпоинтов: {stats['checkpoints']}")
|
||
print(f" Время: {stats['computeTimeSeconds']:.2f}s")
|
||
print(f" Макс. скорость: {stats['maxSpeed']}")
|
||
print(f" Итераций: {stats['iterations']}")
|
||
|
||
return result['solution']
|
||
else:
|
||
print(f"\n❌ Ошибка: {result['error']}")
|
||
return None
|
||
|
||
except requests.exceptions.ConnectionError:
|
||
print(f"\n❌ Не удалось подключиться к серверу {api_url}")
|
||
print(" Убедитесь, что сервер запущен: ./run-webservice.sh")
|
||
return None
|
||
except Exception as e:
|
||
print(f"\n❌ Ошибка: {e}")
|
||
return None
|
||
|
||
|
||
def save_solution(solution, output_file):
|
||
"""Сохраняет решение в файл"""
|
||
|
||
if solution is None:
|
||
return
|
||
|
||
solution_data = {"solution": solution}
|
||
|
||
with open(output_file, 'w') as f:
|
||
json.dump(solution_data, f, indent=2)
|
||
|
||
print(f"\n💾 Решение сохранено в {output_file}")
|
||
|
||
|
||
def check_health(api_url):
|
||
"""Проверяет состояние сервера"""
|
||
|
||
try:
|
||
response = requests.get(f'{api_url}/health')
|
||
health = response.json()
|
||
|
||
print(f"🏥 Health Check:")
|
||
print(f" Status: {health['status']}")
|
||
print(f" Version: {health['version']}")
|
||
print(f" Timestamp: {health['timestamp']}")
|
||
|
||
return health['status'] == 'healthy'
|
||
except:
|
||
return False
|
||
|
||
|
||
def main():
|
||
"""Главная функция"""
|
||
|
||
api_url = os.getenv('API_URL', 'http://localhost:5000')
|
||
|
||
print("╔════════════════════════════════════════════════════════════╗")
|
||
print("║ Racing A* Solver - Python Client Example ║")
|
||
print("╚════════════════════════════════════════════════════════════╝\n")
|
||
|
||
# Проверяем аргументы
|
||
if len(sys.argv) < 2:
|
||
print("Использование:")
|
||
print(f" {sys.argv[0]} <map-file.json> [output-file.json]")
|
||
print(f"\nПример:")
|
||
print(f" {sys.argv[0]} maps/simple-test.json solution.json")
|
||
sys.exit(1)
|
||
|
||
map_file = sys.argv[1]
|
||
output_file = sys.argv[2] if len(sys.argv) > 2 else 'solution.json'
|
||
|
||
print(f"🌐 API URL: {api_url}\n")
|
||
|
||
# Проверяем здоровье сервера
|
||
if not check_health(api_url):
|
||
print("\n❌ Сервер недоступен!")
|
||
sys.exit(1)
|
||
|
||
print()
|
||
|
||
# Решаем карту
|
||
solution = solve_map(api_url, map_file)
|
||
|
||
# Сохраняем решение
|
||
if solution:
|
||
save_solution(solution, output_file)
|
||
print("\n✅ Готово!")
|
||
else:
|
||
print("\n❌ Не удалось получить решение")
|
||
sys.exit(1)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|
||
|