An open API service indexing awesome lists of open source software.

https://github.com/tsnsoft/tsn_springboot_demo

Пример технологии Spring Boot на Java в NetBeans
https://github.com/tsnsoft/tsn_springboot_demo

api java netbeans rest rest-api spring spring-boot

Last synced: 2 months ago
JSON representation

Пример технологии Spring Boot на Java в NetBeans

Awesome Lists containing this project

README

          

# TSN_SpringBoot_demo
Пример технологии Spring Boot на Java в NetBeans

## 1. Обзор программы
Программа состоит из двух частей:
- **Сервер (TSN_TodoApp)**: REST API на Spring Boot для управления списком задач (To-Do List). Задачи хранятся в памяти (без базы данных). API позволяет создавать, читать, обновлять и удалять задачи через HTTP-запросы.
- **Клиент (TodoClient)**: Консольное Java-приложение, которое вызывает API через HTTP-запросы. Оно предоставляет меню для взаимодействия с задачами: просмотр списка, создание, обновление и удаление.

Программа демонстрирует клиент-серверную архитектуру: клиент отправляет запросы на сервер, сервер обрабатывает их и возвращает ответы. Данные передаются в формате JSON.

**Ключевые технологии**:
- Java 17.
- Spring Boot (для сервера).
- `java.net.http.HttpClient` (для клиента, стандартная библиотека Java).
- `org.json` (для парсинга JSON в клиенте).

**Ограничения**:
- Задачи хранятся в памяти сервера, поэтому теряются при перезапуске.
- Нет валидации данных (например, пустое описание задачи).
- Клиент — консольный, без GUI.

## 2. Компоненты сервера (TSN_TodoApp)
Сервер — это Spring Boot приложение, которое запускает веб-сервер Tomcat на порту 8080 и предоставляет REST API по пути `/api/tasks`. Вот описание ключевых классов:

### 2.1. `Task.java`
- **Назначение**: Модель данных для задачи.
- **Поля**:
- `id` (Long): Уникальный идентификатор задачи (генерируется сервером).
- `description` (String): Описание задачи.
- `completed` (boolean): Статус выполнения (true — выполнена, false — нет).
- **Методы**:
- Геттеры и сеттеры для каждого поля.
- Конструкторы: пустой (для десериализации JSON) и с параметрами (для создания задачи с описанием и статусом).
- **Как работает**: Этот класс используется для представления задач в JSON-формате при обмене данными между клиентом и сервером.

### 2.2. `TaskService.java`
- **Назначение**: Бизнес-логика для работы с задачами (CRUD-операции).
- **Аннотации**: `@Service` — делает класс компонентом Spring для внедрения зависимостей.
- **Поля**:
- `tasks` (List): Список задач в памяти.
- `counter` (AtomicLong): Счётчик для генерации ID.
- **Методы**:
- `getAllTasks()`: Возвращает все задачи.
- `getTaskById(Long id)`: Ищет задачу по ID (через цикл).
- `createTask(Task task)`: Генерирует ID, добавляет задачу в список и возвращает её.
- `updateTask(Long id, Task updatedTask)`: Обновляет описание и статус задачи по ID (если найдена).
- `deleteTask(Long id)`: Удаляет задачу по ID (возвращает true/false).
- **Как работает**: Сервис управляет данными в памяти. Нет базы данных, поэтому данные временные.

### 2.3. `TaskController.java`
- **Назначение**: Обработка HTTP-запросов (REST-контроллер).
- **Аннотации**:
- `@RestController`: Указывает, что класс возвращает JSON.
- `@RequestMapping("/api/tasks")`: Базовый путь для API.
- `@Autowired`: Внедряет `TaskService`.
- **Методы**:
- `getAllTasks()` (@GetMapping): Возвращает список задач (HTTP 200).
- `getTaskById(Long id)` (@GetMapping("/{id}"): Возвращает задачу по ID или 404.
- `createTask(Task task)` (@PostMapping): Создаёт задачу и возвращает её (HTTP 200).
- `updateTask(Long id, Task task)` (@PutMapping("/{id}"): Обновляет задачу или возвращает 404.
- `deleteTask(Long id)` (@DeleteMapping("/{id}"): Удаляет задачу (HTTP 204 или 404).
- **Как работает**: Контроллер получает запросы, вызывает сервис и возвращает ответы в JSON. Использует `ResponseEntity` для управления HTTP-статусами.

### 2.4. `CorsConfig.java`
- **Назначение**: Разрешение CORS для кросс-доменных запросов (например, от клиента).
- **Аннотации**: `@Configuration`: Делает класс конфигурацией Spring.
- **Метод**: `addCorsMappings(CorsRegistry registry)`: Разрешает запросы с любого источника (`allowedOrigins("*")`) для методов GET, POST и т.д.
- **Как работает**: Без этого класса браузер или клиент может блокировать запросы из-за политики безопасности. Это критично для веб-клиентов (HTML/JS), но для консольного Java-клиента не обязательно.

### 2.5. `TSN_TodoApp.java`
- **Назначение**: Главный класс для запуска сервера.
- **Аннотации**: `@SpringBootApplication`: Автоматическая настройка Spring (сканирование компонентов, конфигурация).
- **Метод**: `main(String[] args)`: Запускает Spring Boot приложение.
- **Как работает**: При запуске Spring сканирует пакеты, находит контроллер и сервис, и запускает сервер на порту 8080.

## 3. Компоненты клиента (TodoClient.java)
Клиент — консольное приложение, которое отправляет HTTP-запросы к серверу.

- **Поля**:
- `API_URL`: Базовый URL API.
- `client`: HTTP-клиент для запросов.
- **Метод `main`**:
- Отображает меню (1–5).
- Обрабатывает выбор пользователя через `switch`.
- Вызывает методы для операций.
- **Методы**:
- `getAllTasks()`: GET-запрос для получения задач. Парсит JSON с помощью `org.json`, выводит в формате "ID: X, Описание: Y, Выполнена: Z".
- `createTask(Scanner scanner)`: POST-запрос для создания задачи (формирует JSON, отправляет).
- `updateTask(Scanner scanner)`: PUT-запрос для обновления (формирует JSON с новыми данными).
- `deleteTask(Scanner scanner)`: DELETE-запрос для удаления.
- **Как работает**: Использует `HttpClient` для отправки запросов. Ответы парсятся (для GET) или проверяются по статусу.

## 4. Как запустить программу
### 4.1. Запуск сервера (TSN_TodoApp)
1. Убедитесь, что JDK 17 установлен (`JAVA_HOME=C:\Program Files\Java\jdk-17`).
2. Перейдите в папку проекта:
```bash:disable-run
cd D:\Projects\Java\NetBeans\TSN_TodoApp
```
3. Скомпилируйте и запустите:
```bash
mvn clean install
mvn spring-boot:run
```
4. Сервер запустится на `http://localhost:8080`. Проверьте в браузере `http://localhost:8080/api/tasks` (должен вернуть `[]`).

### 4.2. Запуск клиента (TodoClient)
1. Добавьте зависимость `org.json` в `pom.xml` клиента (если используете Maven):
```xml

org.json
json
20231013

```
2. Перейдите в папку клиента:
```bash
cd D:\Projects\Java\NetBeans\TodoClient
```
3. Скомпилируйте и запустите:
```bash
mvn clean compile
mvn exec:java -Dexec.mainClass="kz.proffix4.tsn_todoapp_client.TodoClient"
```
4. Появится меню. Выберите действие и следуйте подсказкам.

## 5. Основы передачи данных по веб
Программа использует веб-протоколы для обмена данными между клиентом и сервером. Вот объяснение ключевых концепций:

### 5.1. HTTP (Hypertext Transfer Protocol)
- **Что это**: Основной протокол для передачи данных в веб. Работает по модели "запрос-ответ": клиент отправляет запрос, сервер возвращает ответ.
- **Методы HTTP** (используемые в программе):
- **GET**: Получение данных (например, список задач). Безопасен, не меняет данные на сервере.
- **POST**: Создание данных (новая задача). Отправляет тело запроса (JSON).
- **PUT**: Обновление данных (изменение задачи). Заменяет существующий ресурс.
- **DELETE**: Удаление данных (удаление задачи).
- **Статусы ответов** (HTTP-коды):
- 200 OK: Успех (для GET, POST, PUT).
- 204 No Content: Успех без тела (для DELETE).
- 404 Not Found: Ресурс не найден (например, задача по ID не существует).
- **Как работает в программе**: Клиент (`HttpClient`) формирует запрос с методом, URI и заголовками (например, `Content-Type: application/json` для JSON). Сервер обрабатывает запрос в контроллере и возвращает ответ.

### 5.2. REST (Representational State Transfer)
- **Что это**: Архитектурный стиль для веб-API. Ресурсы (например, задачи) представляются по URL, операции — через HTTP-методы.
- **Принципы в программе**:
- **Ресурсы**: Задачи — это ресурсы (`/api/tasks` для списка, `/api/tasks/{id}` для конкретной).
- **Статусные коды**: Используются для указания результата (200, 204, 404).
- **Без состояния**: Каждый запрос независим (сервер не хранит состояние клиента).
- **Преимущества**: Простота, масштабируемость, совместимость с веб-стандартами.

### 5.3. JSON (JavaScript Object Notation)
- **Что это**: Легковесный формат для обмена данными (ключ-значение, массивы, объекты). Используется для тела запросов/ответов.
- **Как работает в программе**:
- Сервер (Spring Boot): Автоматически преобразует объекты `Task` в JSON (через Jackson).
- Клиент: Формирует JSON вручную (строка `{ "description": "...", "completed": false }`) для POST/PUT.
- Парсинг: В клиенте `org.json` преобразует ответ сервера в объекты для вывода.
- **Пример JSON**:
```json
{
"id": 1,
"description": "Сходить в магазин",
"completed": false
}
```

### 5.4. CORS (Cross-Origin Resource Sharing)
- **Что это**: Механизм безопасности браузеров, который блокирует запросы с одного домена на другой. В программе решается через `CorsConfig.java`.
- **Как работает**: Сервер добавляет заголовки (например, `Access-Control-Allow-Origin: *`) в ответы, чтобы разрешить запросы. Без CORS клиент (HTML/JS) не сможет вызвать API.
- **В программе**: `CorsConfig` разрешает запросы с любого источника для разработки.

## 6. Примеры использования
1. **Показать задачи** (выбор 1):
- Вывод: Список в формате "ID: X, Описание: Y, Выполнена: Z".
2. **Создать задачу** (выбор 2):
- Введите описание, получите JSON созданной задачи.
3. **Обновить задачу** (выбор 3):
- Введите ID, новое описание и статус.
4. **Удалить задачу** (выбор 4):
- Введите ID, получите подтверждение.

# API Справка для TSN_TodoApp

REST API для управления списком задач (To-Do List). Позволяет создавать, читать, обновлять и удалять задачи, хранящиеся в памяти.

## Базовый URL
```
http://localhost:8080/api/tasks
```

## Структура задачи
Каждая задача имеет следующие поля:
- `id` (Long): Уникальный идентификатор задачи.
- `description` (String): Описание задачи (например, "Сходить в магазин").
- `completed` (boolean): Статус выполнения (`true` — выполнена, `false` — не выполнена).

## Эндпоинты API

| Метод | URL | Описание | Входные данные | Ответ |
|-------|-----|----------|----------------|-------|
| **GET** | `/api/tasks` | Получить все задачи | Нет | JSON-массив задач (или `[]`, если пусто). Статус: `200 OK` |
| **GET** | `/api/tasks/{id}` | Получить задачу по ID | Параметр пути: `id` (Long) | JSON задачи или `404 Not Found` |
| **POST** | `/api/tasks` | Создать новую задачу | JSON: `{ "description": "String", "completed": boolean }` | JSON созданной задачи с ID. Статус: `200 OK` |
| **PUT** | `/api/tasks/{id}` | Обновить задачу | Параметр пути: `id` (Long), JSON: `{ "description": "String", "completed": boolean }` | JSON обновлённой задачи или `404 Not Found` |
| **DELETE** | `/api/tasks/{id}` | Удалить задачу | Параметр пути: `id` (Long) | Статус: `204 No Content` (успех) или `404 Not Found` |

## Примеры запросов

1. **Получить все задачи**
**GET** `http://localhost:8080/api/tasks`
**Ответ**:
```json
[
{
"id": 1,
"description": "Сходить в магазин",
"completed": false
}
]
```

2. **Создать задачу**
**POST** `http://localhost:8080/api/tasks`
**Тело запроса**:
```json
{
"description": "Купить продукты",
"completed": false
}
```
**Ответ**:
```json
{
"id": 2,
"description": "Купить продукты",
"completed": false
}
```

3. **Получить задачу по ID**
**GET** `http://localhost:8080/api/tasks/1`
**Ответ**:
```json
{
"id": 1,
"description": "Сходить в магазин",
"completed": false
}
```

4. **Обновить задачу**
**PUT** `http://localhost:8080/api/tasks/1`
**Тело запроса**:
```json
{
"description": "Сходить в магазин и купить молоко",
"completed": true
}
```
**Ответ**:
```json
{
"id": 1,
"description": "Сходить в магазин и купить молоко",
"completed": true
}
```

5. **Удалить задачу**
**DELETE** `http://localhost:8080/api/tasks/1`
**Ответ**: Пустой (статус `204 No Content`) или `404 Not Found`.

## Замечания
- Данные хранятся в памяти и сбрасываются при перезапуске приложения.
- Нет валидации входных данных (например, пустое `description`).
- Тестируйте с помощью инструментов: Hoppscotch, Insomnia, Thunder Client или curl.