Add lwF4
This commit is contained in:
@@ -21,7 +21,7 @@ Frontend:
|
|||||||
- [Лабораторная работа №F1 - Макет одностраничного сайта (Figma)](./lwF1/README.md)
|
- [Лабораторная работа №F1 - Макет одностраничного сайта (Figma)](./lwF1/README.md)
|
||||||
- [Лабораторная работа №F2 - Каркас одностраничного веб-приложения (React)](./lwF2/README.md)
|
- [Лабораторная работа №F2 - Каркас одностраничного веб-приложения (React)](./lwF2/README.md)
|
||||||
- [Лабораторная работа №F3 - Стилизация веб-приложения (React)](./lwF3/README.md)
|
- [Лабораторная работа №F3 - Стилизация веб-приложения (React)](./lwF3/README.md)
|
||||||
- [Лабораторная работа №F4 - Взаимодействие с API (Axios)](#)
|
- [Лабораторная работа №F4 - Взаимодействие с API (Axios)](./lwF4/README.md)
|
||||||
- [Лабораторная работа №F5 - Повторение на базовых технологиях (HTML, CSS)](#)
|
- [Лабораторная работа №F5 - Повторение на базовых технологиях (HTML, CSS)](#)
|
||||||
|
|
||||||
Backend:
|
Backend:
|
||||||
|
|||||||
224
lwF4/README.md
Normal file
224
lwF4/README.md
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
# Лабораторная работа №F4 - Взаимодействие с API (Axios)
|
||||||
|
|
||||||
|
## Цель работы
|
||||||
|
|
||||||
|
- Освоение взаимодействия между fronend и backend в веб-приложениями посредством технологии `axios`.
|
||||||
|
- Получение навыков формирования макета RESTful API при помощи технологии `json-server`.
|
||||||
|
- Освоение технологии `Postman` для работы с API, основанным на протоколе HTTP(S).
|
||||||
|
|
||||||
|
## Ход работы
|
||||||
|
|
||||||
|
1. Проверить и при необходимости исправить код описания формы ввода данных в приложении из [lwF3](../lwF3/README.md).
|
||||||
|
2. Развернуть API-сервер на основе `json-server` рядом с frontend-приложением.
|
||||||
|
3. Развернуть ПО Postman и выполнить CRUD-запросы на API-сервере (backend).
|
||||||
|
4. Подключить к frontend пакет `axios`.
|
||||||
|
5. Добавить в обработчик отправки формы вызов метода добавления данных в API-сервер при помощи axios.
|
||||||
|
6. Убедиться через Postman и через блокнот, что данные корректно пришли с frontend на backend.
|
||||||
|
|
||||||
|
## Проверка формы ввода
|
||||||
|
|
||||||
|
> TODO: описать, на что стоит обратить внимание.
|
||||||
|
|
||||||
|
При использовании Consta Design, убедитесь, что все текстовые поля записывают значение во внутреннее состояние формы.
|
||||||
|
|
||||||
|
Если используете собственные обёртки, пропсы `value` и `onChange` "перекидывать" из компонентов Consta Design далее.
|
||||||
|
|
||||||
|
Пример формы БЕЗ компонентов-обёрток (у Вас должно быть с "обёртками"):
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
export const FeedbackForm = () => {
|
||||||
|
const [nameValue, setNameValue] = useState<string | null>(null);
|
||||||
|
const [textValue, setTextValue] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const handleSend = () => {
|
||||||
|
/* TODO: логика по отправке данных на сервер. */
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Theme preset={presetGpnDefault}>
|
||||||
|
<TextField
|
||||||
|
onChange={setNameValue}
|
||||||
|
value={nameValue}
|
||||||
|
type="text"
|
||||||
|
label="Имя"
|
||||||
|
placeholder="Как Вас зовут?"
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
onChange={setTextValue}
|
||||||
|
value={textValue}
|
||||||
|
type="textarea"
|
||||||
|
rows={5}
|
||||||
|
label="Сообщение"
|
||||||
|
placeholder="Напишите, что Вы думаете о нас..."
|
||||||
|
/>
|
||||||
|
<Button label="Отправить" onClick={handleSend} />
|
||||||
|
</Theme>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Пример обёртки над текстовым полем:
|
||||||
|
|
||||||
|
```jsx
|
||||||
|
import {
|
||||||
|
TextField as ConstaTextField,
|
||||||
|
TextFieldPropOnChange,
|
||||||
|
TextFieldPropValue,
|
||||||
|
} from "@consta/uikit/TextField";
|
||||||
|
|
||||||
|
interface TextFieldProps {
|
||||||
|
onChange: TextFieldPropOnChange;
|
||||||
|
value: TextFieldPropValue;
|
||||||
|
label: string;
|
||||||
|
placeholder: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TextField = (props: TextFieldProps) => (
|
||||||
|
<ConstaTextField
|
||||||
|
type="text"
|
||||||
|
onChange={props.onChange}
|
||||||
|
value={props.value}
|
||||||
|
label={props.label}
|
||||||
|
placeholder={props.placeholder}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка сервера json-server
|
||||||
|
|
||||||
|
Создайте каталог рядом с react-приложением.
|
||||||
|
|
||||||
|
Создайте в нём файл `db.json` с содержимым:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"feedback": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> Замените `feedback` на кодовое название сущности, к которой относится ваша форма.
|
||||||
|
> Например, `order` для заказа, `thread` для ветви обсуждения и т.п.
|
||||||
|
|
||||||
|
Запустите в консоли в созданном каталоге команду `npx json-server db.json`.
|
||||||
|
|
||||||
|
Примерный вывод:
|
||||||
|
|
||||||
|
```
|
||||||
|
JSON Server started on PORT :3000
|
||||||
|
Press CTRL-C to stop
|
||||||
|
Watching db.json...
|
||||||
|
|
||||||
|
♡( ◡‿◡ )
|
||||||
|
|
||||||
|
Index:
|
||||||
|
http://localhost:3000/
|
||||||
|
|
||||||
|
Static files:
|
||||||
|
Serving ./public directory if it exists
|
||||||
|
|
||||||
|
Endpoints:
|
||||||
|
No endpoints found, try adding some data to db.json
|
||||||
|
|
||||||
|
Endpoints:
|
||||||
|
http://localhost:3000/feedback
|
||||||
|
```
|
||||||
|
|
||||||
|
Запомните последнюю ссылку, она нам понадобится позже.
|
||||||
|
|
||||||
|
## Проверка работы API при помощи утилиты Postman
|
||||||
|
|
||||||
|
Postman – утилита для работы с API-интерфейсами в стиле REST (популярен в web).
|
||||||
|
|
||||||
|
Страница для скачивания: <https://www.postman.com/downloads/>.
|
||||||
|
|
||||||
|
Продолжите запуск без учётной записи (2 раза надо об этом сказать).
|
||||||
|
|
||||||
|
Далее необходимо сделать процедуры CRUD.
|
||||||
|
Это сокращение от Create, Read, Update, Delete.
|
||||||
|
|
||||||
|
Согласно документации json-server доступны следующие методы API (на примере ресурса `posts`):
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /posts
|
||||||
|
GET /posts/:id
|
||||||
|
POST /posts
|
||||||
|
PUT /posts/:id
|
||||||
|
PATCH /posts/:id
|
||||||
|
DELETE /posts/:id
|
||||||
|
```
|
||||||
|
|
||||||
|
Попробуем выполнить запросы по аналогии с feedback.
|
||||||
|
|
||||||
|
Создание:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Просмотр списка:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Просмотр подробностей:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Обновление:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Удаление:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
При этом в файле `db.json` всё время будут происходить изменения, инициированные запросами к API.
|
||||||
|
|
||||||
|
## Подключение axios к frontend
|
||||||
|
|
||||||
|
Axios – технология для вызова API-методов (по аналогии с Postman) для frontend-приложений.
|
||||||
|
|
||||||
|
Устанавливается при помощи команды `npm install axios`.
|
||||||
|
|
||||||
|
Использовать axios необходимо в функции `handleSend`.
|
||||||
|
|
||||||
|
Сделайте это самостоятельно, используя следующие требования/подсказки:
|
||||||
|
|
||||||
|
- Метод `handleSend` удобно поментить `async`.
|
||||||
|
В этом случае вызов `post(endpont, data)` из библиотеки `axios` можно пометить как `await`.
|
||||||
|
- Собирать объект для отправки на бекенд надо прямо в методе `.post`, а не через отдельную контанту/переменную.
|
||||||
|
- При ошибке (например, сервер недоступен) метод `axios.post` выбрасывает исключение.
|
||||||
|
Его надо ловить и каким-то образом показывать на экран.
|
||||||
|
Для этого можно использовать функцию `alert` или ошибку из пакета `react-toastify` (ставится отдельно).
|
||||||
|
- В случае успеха надо также использовать отображение данных через `alert` или `toast`.
|
||||||
|
- Метод не должен ничего выводить в консоль. Только для отладки. Код вывода в консоль перед сдачей лабораторной работы должен быть удалён.
|
||||||
|
|
||||||
|
Пример отправки данных на сервер, который НЕ подходит под требования, но который работает:
|
||||||
|
|
||||||
|
```jsx
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
const handleSend = () => {
|
||||||
|
console.log(nameValue, textValue);
|
||||||
|
const data = {
|
||||||
|
name: nameValue,
|
||||||
|
text: textValue,
|
||||||
|
};
|
||||||
|
axios
|
||||||
|
.post("http://localhost:3000/feedback", data)
|
||||||
|
.then(() => alert("Данные отправлены, спасибо!"));
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка работы
|
||||||
|
|
||||||
|
Убедитесь, что после отправки формы в файле `db.json` появляются указанные в полях ввода данные.
|
||||||
|
Дополнительно убедитесь, что через Postman в методе GET также возвращаются эти же данные.
|
||||||
|
|
||||||
|
Убедитесь, что при отключении json-server приложение React начинает выдавать ошибку отправки, правда спустя какое-то время (тайм-аут).
|
||||||
|
|
||||||
|
## Дополнительные улучшения
|
||||||
|
|
||||||
|
> За которые возможны доп. баллы.
|
||||||
|
|
||||||
|
1. Вместо alert использовать react-toastify с правильно подобранными типами уведомлений: для ошибки - ошибка, для успеха - успех.
|
||||||
|
2. Необходимо на время отправки данных блокировать (disabled) кнопку отправки и поля ввода.
|
||||||
|
3. Если при отправке формы был получен успешный ответ от API, получать и выводить `id` созданной сущности.
|
||||||
|
Например, `Обращение №4ba0 зарегистрировано, спасибо!`
|
||||||
BIN
lwF4/postman_delete.png
Normal file
BIN
lwF4/postman_delete.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
BIN
lwF4/postman_get.png
Normal file
BIN
lwF4/postman_get.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
BIN
lwF4/postman_get_all.png
Normal file
BIN
lwF4/postman_get_all.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
BIN
lwF4/postman_post.png
Normal file
BIN
lwF4/postman_post.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
BIN
lwF4/postman_put.png
Normal file
BIN
lwF4/postman_put.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
Reference in New Issue
Block a user