Суть проекта заключается в создании REST API для описания валют и обменных курсов. Данный интерфейс позволяет просматривать и редактировать списки валют и обменных курсов, совершать расчёт конвертации произвольных сумм из одной валюты в другую. Веб-интерфейс для проекта не подразумевается.
- правильное создание REST API,
- грамотное наименование ресурсов,
- использование правильных HTTP кодов ответа,
- взаимодействие с базами данных посредством использования SQL запросов,
- знакомство с JDBC,
- знакомство с Java Servlet,
- получение опыта развертывания приложения на реальном сервере.
- Java Servlets
- JDBC
- SQLite
- Postman
- Maven
- Git
- Tomcat
В качестве базы данных в приложении использована SQLite, так как она позволяет встраивать файл базы непосредственно в структуру проекта. Это позволит немного упростить деплой проекта на сервере. Диаграмма базы данных (для SQLite) изображена на рисунке:
GET /currencies
Получение списка валют. Пример ответа:
[
{
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
{
"id": 0,
"name": "Euro",
"code": "EUR",
"sign": "€"
}
]
HTTP коды ответов:
- Успех - 200
- Ошибка (например, база данных недоступна) - 500.
GET /currency/EUR
Получение конкретной валюты. Пример ответа:
{
"id": 0,
"name": "Euro",
"code": "EUR",
"sign": "€"
}
HTTP коды ответов:
- Успех - 200
- Код валюты отсутствует в адресе - 400
- Валюта не найдена - 404
- Ошибка (например, база данных недоступна) - 500
POST /currencies
Добавление новой валюты в базу данных. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded).
Поля формы - name, code, sign.
Пример ответа: JSON представление вставленной в базу записи, включая ее ID:
{
"id": 0,
"name": "Euro",
"code": "EUR",
"sign": "€"
}
HTTP коды ответов:
- Успех - 200
- Отсутствует нужное поле формы - 400
- Валюта с таким кодом уже существует - 409
- Ошибка (например, база данных недоступна) - 500
GET /exchangeRates
Получение списка всех обменных курсов. Пример ответа:
[
{
"id": 0,
"baseCurrency": {
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
"targetCurrency": {
"id": 1,
"name": "Euro",
"code": "EUR",
"sign": "€"
},
"rate": 0.99
}
]
HTTP коды ответов:
- Успех - 200
- Ошибка (например, база данных недоступна) - 500
GET /exchangeRate/USDRUB/
Получение конкретного обменного курса. Валютная пара задается идущими подряд кодами валют в адресе запроса. Пример ответа:
{
"id": 0,
"baseCurrency": {
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
"targetCurrency": {
"id": 1,
"name": "Euro",
"code": "EUR",
"sign": "€"
},
"rate": 0.99
}
HTTP коды ответа:
- Успех - 200
- Коды валют пары отсутствуют в адресе - 400
- Обменный курс для пары не найден - 404
- Ошибка (например, база данных недоступна) - 500
POST /exchangeRates
Добавление нового обменного курса в базу. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded). Поля формы: baseCurrencyCode, targetCurrencyCode, rate.
Пример полей формы:
- baseCurrencyCode - USD
- targetCurrencyCode - EUR
- rate - 0.99
Пример ответа: JSON представление вставленной в базу записи, включая ее ID:
{
"id": 0,
"baseCurrency": {
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
"targetCurrency": {
"id": 1,
"name": "Euro",
"code": "EUR",
"sign": "€"
},
"rate": 0.99
}
HTTP коды ответов:
- Успех - 200
- Отсутствует нужное поле формы - 400
- Валютная пара с таким кодом уже существует - 409
- Ошибка (например, база данных недоступна) - 500
PATCH /exchangeRate/USDRUB
Обновление существующего в базе обменного курса. Валютная пара задаётся идущими подряд кодами валют в адресе запроса. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded). Единственное поле формы - rate.
Пример ответа - JSON представление обновлённой записи в базе данных, включая её ID:
{
"id": 0,
"baseCurrency": {
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
"targetCurrency": {
"id": 1,
"name": "Euro",
"code": "EUR",
"sign": "€"
},
"rate": 0.99
}
HTTP коды ответов:
- Успех - 200
- Отсутствует нужное поле формы - 400
- Валютная пара отсутствует в базе данных - 404
- Ошибка (например, база данных недоступна) - 500
GET /exchange?from=BASE_CURRENCY_CODE&to=TARGET_CURRENCY_CODE&amount=$AMOUNT
Расчёт перевода определённого количества средств из одной валюты в другую.
Пример запроса - GET /exchange?from=USD&to=AUD&amount=10.
Пример ответа:
{
"baseCurrency": {
"id": 0,
"name": "United States dollar",
"code": "USD",
"sign": "$"
},
"targetCurrency": {
"id": 1,
"name": "Australian dollar",
"code": "AUD",
"sign": "A€"
},
"rate": 1.45,
"amount": 10.00
"convertedAmount": 14.50
}
Получение курса для обмена может пройти по одному из трёх сценариев. Допустим, совершаем перевод из валюты A в валюту B:
- В таблице ExchangeRates существует валютная пара AB - берём её курс
- В таблице ExchangeRates существует валютная пара BA - берем её курс, и считаем обратный, чтобы получить AB
- В таблице ExchangeRates существуют валютные пары USD-A и USD-B - вычисляем из этих курсов курс AB Остальные возможные сценарии, для упрощения, были опущены.
Для всех запросов в случае ошибки ответ передается в виде JSON объекта следующего вида:
{
"message": "Валюта не найдена"
}
Значение message зависит от того, какая именно ошибка произошла.
Специально для данного проекта Сергеем Жуковым была написана реализация интерфейса обменника.
Для развертывания приложения в Docker в папке проекта выполнить последовательно следующие команды:
docker build -t currency-exchanger .
docker run -d -p 8080:8080 currency-exchanger
После успешного выполнения команд можно делать запросы через браузер или Postman по адресу http://localhost:8080/CurrencyExchanger в соответствии с описанным выше REST API.
- Создать заготовку Java бэкенд приложения с javax.servlet
- Создать таблицы в базе данных, и вручную их заполнить начальными данными (несколько валют, обменных курсов)
- Реализовать методы REST API для работы с валютами
- Реализовать методы REST API для работы с обменными курсами
- Реализовать метод REST API с подсчётом обмена валюты
- Создание образа в Docker
- Деплой на удалённый сервер
Проект реализован в рамках курса.