{"id":31916884,"url":"https://github.com/tsnsoft/tsn_springboot_demo","last_synced_at":"2026-04-19T14:34:24.997Z","repository":{"id":317835557,"uuid":"1069000982","full_name":"tsnsoft/TSN_SpringBoot_demo","owner":"tsnsoft","description":"Пример технологии Spring Boot на Java в NetBeans","archived":false,"fork":false,"pushed_at":"2025-10-03T09:49:21.000Z","size":17744,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-03T11:40:48.741Z","etag":null,"topics":["api","java","netbeans","rest","rest-api","spring","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tsnsoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-03T08:45:10.000Z","updated_at":"2025-10-03T09:49:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"0b116ccb-8491-4065-8d3b-8d108290cac3","html_url":"https://github.com/tsnsoft/TSN_SpringBoot_demo","commit_stats":null,"previous_names":["tsnsoft/tsn_springboot_demo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/tsnsoft/TSN_SpringBoot_demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsnsoft%2FTSN_SpringBoot_demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsnsoft%2FTSN_SpringBoot_demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsnsoft%2FTSN_SpringBoot_demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsnsoft%2FTSN_SpringBoot_demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tsnsoft","download_url":"https://codeload.github.com/tsnsoft/TSN_SpringBoot_demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsnsoft%2FTSN_SpringBoot_demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279016939,"owners_count":26085906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","java","netbeans","rest","rest-api","spring","spring-boot"],"created_at":"2025-10-13T20:14:49.175Z","updated_at":"2025-10-13T20:14:59.559Z","avatar_url":"https://github.com/tsnsoft.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# TSN_SpringBoot_demo\nПример технологии Spring Boot на Java в NetBeans\n\n## 1. Обзор программы\nПрограмма состоит из двух частей:\n- **Сервер (TSN_TodoApp)**: REST API на Spring Boot для управления списком задач (To-Do List). Задачи хранятся в памяти (без базы данных). API позволяет создавать, читать, обновлять и удалять задачи через HTTP-запросы.\n- **Клиент (TodoClient)**: Консольное Java-приложение, которое вызывает API через HTTP-запросы. Оно предоставляет меню для взаимодействия с задачами: просмотр списка, создание, обновление и удаление.\n\nПрограмма демонстрирует клиент-серверную архитектуру: клиент отправляет запросы на сервер, сервер обрабатывает их и возвращает ответы. Данные передаются в формате JSON.\n\n**Ключевые технологии**:\n- Java 17.\n- Spring Boot (для сервера).\n- `java.net.http.HttpClient` (для клиента, стандартная библиотека Java).\n- `org.json` (для парсинга JSON в клиенте).\n\n**Ограничения**:\n- Задачи хранятся в памяти сервера, поэтому теряются при перезапуске.\n- Нет валидации данных (например, пустое описание задачи).\n- Клиент — консольный, без GUI.\n\n## 2. Компоненты сервера (TSN_TodoApp)\nСервер — это Spring Boot приложение, которое запускает веб-сервер Tomcat на порту 8080 и предоставляет REST API по пути `/api/tasks`. Вот описание ключевых классов:\n\n### 2.1. `Task.java`\n- **Назначение**: Модель данных для задачи.\n- **Поля**:\n  - `id` (Long): Уникальный идентификатор задачи (генерируется сервером).\n  - `description` (String): Описание задачи.\n  - `completed` (boolean): Статус выполнения (true — выполнена, false — нет).\n- **Методы**:\n  - Геттеры и сеттеры для каждого поля.\n  - Конструкторы: пустой (для десериализации JSON) и с параметрами (для создания задачи с описанием и статусом).\n- **Как работает**: Этот класс используется для представления задач в JSON-формате при обмене данными между клиентом и сервером.\n\n### 2.2. `TaskService.java`\n- **Назначение**: Бизнес-логика для работы с задачами (CRUD-операции).\n- **Аннотации**: `@Service` — делает класс компонентом Spring для внедрения зависимостей.\n- **Поля**:\n  - `tasks` (List\u003cTask\u003e): Список задач в памяти.\n  - `counter` (AtomicLong): Счётчик для генерации ID.\n- **Методы**:\n  - `getAllTasks()`: Возвращает все задачи.\n  - `getTaskById(Long id)`: Ищет задачу по ID (через цикл).\n  - `createTask(Task task)`: Генерирует ID, добавляет задачу в список и возвращает её.\n  - `updateTask(Long id, Task updatedTask)`: Обновляет описание и статус задачи по ID (если найдена).\n  - `deleteTask(Long id)`: Удаляет задачу по ID (возвращает true/false).\n- **Как работает**: Сервис управляет данными в памяти. Нет базы данных, поэтому данные временные.\n\n### 2.3. `TaskController.java`\n- **Назначение**: Обработка HTTP-запросов (REST-контроллер).\n- **Аннотации**:\n  - `@RestController`: Указывает, что класс возвращает JSON.\n  - `@RequestMapping(\"/api/tasks\")`: Базовый путь для API.\n  - `@Autowired`: Внедряет `TaskService`.\n- **Методы**:\n  - `getAllTasks()` (@GetMapping): Возвращает список задач (HTTP 200).\n  - `getTaskById(Long id)` (@GetMapping(\"/{id}\"): Возвращает задачу по ID или 404.\n  - `createTask(Task task)` (@PostMapping): Создаёт задачу и возвращает её (HTTP 200).\n  - `updateTask(Long id, Task task)` (@PutMapping(\"/{id}\"): Обновляет задачу или возвращает 404.\n  - `deleteTask(Long id)` (@DeleteMapping(\"/{id}\"): Удаляет задачу (HTTP 204 или 404).\n- **Как работает**: Контроллер получает запросы, вызывает сервис и возвращает ответы в JSON. Использует `ResponseEntity` для управления HTTP-статусами.\n\n### 2.4. `CorsConfig.java`\n- **Назначение**: Разрешение CORS для кросс-доменных запросов (например, от клиента).\n- **Аннотации**: `@Configuration`: Делает класс конфигурацией Spring.\n- **Метод**: `addCorsMappings(CorsRegistry registry)`: Разрешает запросы с любого источника (`allowedOrigins(\"*\")`) для методов GET, POST и т.д.\n- **Как работает**: Без этого класса браузер или клиент может блокировать запросы из-за политики безопасности. Это критично для веб-клиентов (HTML/JS), но для консольного Java-клиента не обязательно.\n\n### 2.5. `TSN_TodoApp.java`\n- **Назначение**: Главный класс для запуска сервера.\n- **Аннотации**: `@SpringBootApplication`: Автоматическая настройка Spring (сканирование компонентов, конфигурация).\n- **Метод**: `main(String[] args)`: Запускает Spring Boot приложение.\n- **Как работает**: При запуске Spring сканирует пакеты, находит контроллер и сервис, и запускает сервер на порту 8080.\n\n## 3. Компоненты клиента (TodoClient.java)\nКлиент — консольное приложение, которое отправляет HTTP-запросы к серверу.\n\n- **Поля**:\n  - `API_URL`: Базовый URL API.\n  - `client`: HTTP-клиент для запросов.\n- **Метод `main`**:\n  - Отображает меню (1–5).\n  - Обрабатывает выбор пользователя через `switch`.\n  - Вызывает методы для операций.\n- **Методы**:\n  - `getAllTasks()`: GET-запрос для получения задач. Парсит JSON с помощью `org.json`, выводит в формате \"ID: X, Описание: Y, Выполнена: Z\".\n  - `createTask(Scanner scanner)`: POST-запрос для создания задачи (формирует JSON, отправляет).\n  - `updateTask(Scanner scanner)`: PUT-запрос для обновления (формирует JSON с новыми данными).\n  - `deleteTask(Scanner scanner)`: DELETE-запрос для удаления.\n- **Как работает**: Использует `HttpClient` для отправки запросов. Ответы парсятся (для GET) или проверяются по статусу.\n\n## 4. Как запустить программу\n### 4.1. Запуск сервера (TSN_TodoApp)\n1. Убедитесь, что JDK 17 установлен (`JAVA_HOME=C:\\Program Files\\Java\\jdk-17`).\n2. Перейдите в папку проекта:\n   ```bash:disable-run\n   cd D:\\Projects\\Java\\NetBeans\\TSN_TodoApp\n   ```\n3. Скомпилируйте и запустите:\n   ```bash\n   mvn clean install\n   mvn spring-boot:run\n   ```\n4. Сервер запустится на `http://localhost:8080`. Проверьте в браузере `http://localhost:8080/api/tasks` (должен вернуть `[]`).\n\n### 4.2. Запуск клиента (TodoClient)\n1. Добавьте зависимость `org.json` в `pom.xml` клиента (если используете Maven):\n   ```xml\n   \u003cdependency\u003e\n       \u003cgroupId\u003eorg.json\u003c/groupId\u003e\n       \u003cartifactId\u003ejson\u003c/artifactId\u003e\n       \u003cversion\u003e20231013\u003c/version\u003e\n   \u003c/dependency\u003e\n   ```\n2. Перейдите в папку клиента:\n   ```bash\n   cd D:\\Projects\\Java\\NetBeans\\TodoClient\n   ```\n3. Скомпилируйте и запустите:\n   ```bash\n   mvn clean compile\n   mvn exec:java -Dexec.mainClass=\"kz.proffix4.tsn_todoapp_client.TodoClient\"\n   ```\n4. Появится меню. Выберите действие и следуйте подсказкам.\n\n## 5. Основы передачи данных по веб\nПрограмма использует веб-протоколы для обмена данными между клиентом и сервером. Вот объяснение ключевых концепций:\n\n### 5.1. HTTP (Hypertext Transfer Protocol)\n- **Что это**: Основной протокол для передачи данных в веб. Работает по модели \"запрос-ответ\": клиент отправляет запрос, сервер возвращает ответ.\n- **Методы HTTP** (используемые в программе):\n  - **GET**: Получение данных (например, список задач). Безопасен, не меняет данные на сервере.\n  - **POST**: Создание данных (новая задача). Отправляет тело запроса (JSON).\n  - **PUT**: Обновление данных (изменение задачи). Заменяет существующий ресурс.\n  - **DELETE**: Удаление данных (удаление задачи).\n- **Статусы ответов** (HTTP-коды):\n  - 200 OK: Успех (для GET, POST, PUT).\n  - 204 No Content: Успех без тела (для DELETE).\n  - 404 Not Found: Ресурс не найден (например, задача по ID не существует).\n- **Как работает в программе**: Клиент (`HttpClient`) формирует запрос с методом, URI и заголовками (например, `Content-Type: application/json` для JSON). Сервер обрабатывает запрос в контроллере и возвращает ответ.\n\n### 5.2. REST (Representational State Transfer)\n- **Что это**: Архитектурный стиль для веб-API. Ресурсы (например, задачи) представляются по URL, операции — через HTTP-методы.\n- **Принципы в программе**:\n  - **Ресурсы**: Задачи — это ресурсы (`/api/tasks` для списка, `/api/tasks/{id}` для конкретной).\n  - **Статусные коды**: Используются для указания результата (200, 204, 404).\n  - **Без состояния**: Каждый запрос независим (сервер не хранит состояние клиента).\n- **Преимущества**: Простота, масштабируемость, совместимость с веб-стандартами.\n\n### 5.3. JSON (JavaScript Object Notation)\n- **Что это**: Легковесный формат для обмена данными (ключ-значение, массивы, объекты). Используется для тела запросов/ответов.\n- **Как работает в программе**:\n  - Сервер (Spring Boot): Автоматически преобразует объекты `Task` в JSON (через Jackson).\n  - Клиент: Формирует JSON вручную (строка `{ \"description\": \"...\", \"completed\": false }`) для POST/PUT.\n  - Парсинг: В клиенте `org.json` преобразует ответ сервера в объекты для вывода.\n- **Пример JSON**:\n  ```json\n  {\n    \"id\": 1,\n    \"description\": \"Сходить в магазин\",\n    \"completed\": false\n  }\n  ```\n\n### 5.4. CORS (Cross-Origin Resource Sharing)\n- **Что это**: Механизм безопасности браузеров, который блокирует запросы с одного домена на другой. В программе решается через `CorsConfig.java`.\n- **Как работает**: Сервер добавляет заголовки (например, `Access-Control-Allow-Origin: *`) в ответы, чтобы разрешить запросы. Без CORS клиент (HTML/JS) не сможет вызвать API.\n- **В программе**: `CorsConfig` разрешает запросы с любого источника для разработки.\n\n## 6. Примеры использования\n1. **Показать задачи** (выбор 1):\n   - Вывод: Список в формате \"ID: X, Описание: Y, Выполнена: Z\".\n2. **Создать задачу** (выбор 2):\n   - Введите описание, получите JSON созданной задачи.\n3. **Обновить задачу** (выбор 3):\n   - Введите ID, новое описание и статус.\n4. **Удалить задачу** (выбор 4):\n   - Введите ID, получите подтверждение.\n\n# API Справка для TSN_TodoApp\n\nREST API для управления списком задач (To-Do List). Позволяет создавать, читать, обновлять и удалять задачи, хранящиеся в памяти.\n\n## Базовый URL\n```\nhttp://localhost:8080/api/tasks\n```\n\n## Структура задачи\nКаждая задача имеет следующие поля:\n- `id` (Long): Уникальный идентификатор задачи.\n- `description` (String): Описание задачи (например, \"Сходить в магазин\").\n- `completed` (boolean): Статус выполнения (`true` — выполнена, `false` — не выполнена).\n\n## Эндпоинты API\n\n| Метод | URL | Описание | Входные данные | Ответ |\n|-------|-----|----------|----------------|-------|\n| **GET** | `/api/tasks` | Получить все задачи | Нет | JSON-массив задач (или `[]`, если пусто). Статус: `200 OK` |\n| **GET** | `/api/tasks/{id}` | Получить задачу по ID | Параметр пути: `id` (Long) | JSON задачи или `404 Not Found` |\n| **POST** | `/api/tasks` | Создать новую задачу | JSON: `{ \"description\": \"String\", \"completed\": boolean }` | JSON созданной задачи с ID. Статус: `200 OK` |\n| **PUT** | `/api/tasks/{id}` | Обновить задачу | Параметр пути: `id` (Long), JSON: `{ \"description\": \"String\", \"completed\": boolean }` | JSON обновлённой задачи или `404 Not Found` |\n| **DELETE** | `/api/tasks/{id}` | Удалить задачу | Параметр пути: `id` (Long) | Статус: `204 No Content` (успех) или `404 Not Found` |\n\n## Примеры запросов\n\n1. **Получить все задачи**  \n   **GET** `http://localhost:8080/api/tasks`  \n   **Ответ**:\n   ```json\n   [\n       {\n           \"id\": 1,\n           \"description\": \"Сходить в магазин\",\n           \"completed\": false\n       }\n   ]\n   ```\n\n2. **Создать задачу**  \n   **POST** `http://localhost:8080/api/tasks`  \n   **Тело запроса**:\n   ```json\n   {\n       \"description\": \"Купить продукты\",\n       \"completed\": false\n   }\n   ```  \n   **Ответ**:\n   ```json\n   {\n       \"id\": 2,\n       \"description\": \"Купить продукты\",\n       \"completed\": false\n   }\n   ```\n\n3. **Получить задачу по ID**  \n   **GET** `http://localhost:8080/api/tasks/1`  \n   **Ответ**:\n   ```json\n   {\n       \"id\": 1,\n       \"description\": \"Сходить в магазин\",\n       \"completed\": false\n   }\n   ```\n\n4. **Обновить задачу**  \n   **PUT** `http://localhost:8080/api/tasks/1`  \n   **Тело запроса**:\n   ```json\n   {\n       \"description\": \"Сходить в магазин и купить молоко\",\n       \"completed\": true\n   }\n   ```  \n   **Ответ**:\n   ```json\n   {\n       \"id\": 1,\n       \"description\": \"Сходить в магазин и купить молоко\",\n       \"completed\": true\n   }\n   ```\n\n5. **Удалить задачу**  \n   **DELETE** `http://localhost:8080/api/tasks/1`  \n   **Ответ**: Пустой (статус `204 No Content`) или `404 Not Found`.\n\n## Замечания\n- Данные хранятся в памяти и сбрасываются при перезапуске приложения.\n- Нет валидации входных данных (например, пустое `description`).\n- Тестируйте с помощью инструментов: Hoppscotch, Insomnia, Thunder Client или curl.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftsnsoft%2Ftsn_springboot_demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftsnsoft%2Ftsn_springboot_demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftsnsoft%2Ftsn_springboot_demo/lists"}