Этот проект представляет собой веб-калькулятор для подсчёта арифметических выражений. Сервис принимает выражение через HTTP-запрос и возвращает результат вычисления.
- Go — основной язык программирования.
- mux — для маршрутизации HTTP-запросов.
- logrus — для логирования.
- HTTP API: Принимает математическое выражение и возвращает результат вычислений.
- Обработка ошибок: Возвращает сообщения об ошибках с соответствующими HTTP-кодами.
- Логирование: Логирование запросов и ошибок осуществляется в консоль с использованием библиотеки
logrus.
- Go версии 1.23.4.
git clone https://github.com/dimasmir03/Calc_GO
cd Calc_GO go mod tidy- C указанием порта через переменную окружения
export PORT=8787 && go run ./cmd/calc/...- C указанием порта через переменную окружения
$env:PORT=8787; go run ./cmd/calc/...- Сервер будет запущен на порту 8080
go run ./cmd/calc/...После запуска сервер будет доступен по адресу http://localhost:<PORT>, где <PORT> — это порт, который вы указали в переменной окружения.
Тестирование
Для запуска тестов выполните следующую команду:
go test ./...Тесты проверяют корректность работы API, обработку различных ошибок и корректность выполнения математических операций.
Пример результата тестирования:
ok github.com/dimasmir03/Calc_GO/internal/application 0.272s ok github.com/dimasmir03/Calc_GO/pkg/calculation 0.181s
Эндпоинт принимает JSON-запрос с математическим выражением и возвращает результат вычислений или сообщение об ошибке.
Пример запроса:
{
"expression": "2+2*2"
}Пример ответа:
-
Успешный результат:
{ "result": "6" } -
Ошибка (Некорректное выражение):
{ "error": "Expression is not valid" }HTTP-код: 422
-
Ошибка (Внутренняя ошибка сервера):
{ "error": "Internal server error" }HTTP-код: 500
Запрос:
curl --location 'localhost:8080/api/v1/calculate' \
--header 'Content-Type: application/json' \
--data '{"expression": "2+2*2"}'Ответ:
{
"result": "6"
}- Примечание: Для отображения заголовка ответа, включая код статуса, используйте параметр -i:
curl -i --location 'localhost:8080/api/v1/calculate' \
--header 'Content-Type: application/json' \
--data '{"expression": "2+2*2"}'-
Некорректное выражение:
Запрос:
curl -i --location 'localhost:8080/api/v1/calculate' \ --header 'Content-Type: application/json' \ --data '{"expression": "2+2**2"}'
Ответ:
{ "error": "invalid expression" }HTTP-код: 422
-
Деление на ноль:
Запрос:
curl --location 'localhost:8080/api/v1/calculate' \ --header 'Content-Type: application/json' \ --data '{"expression": "10/0"}'
Ответ:
{ "error": "division by zero" }HTTP-код: 422
-
Неправильный символ в выражении:
Запрос:
curl --location 'localhost:8080/api/v1/calculate' \
--header 'Content-Type: application/json' \
--data '{"expression": "2+a"}'Ответ:
{
"error": "invalid character"
}HTTP-код: 422
- Несовпадающие круглых скобок:
Запрос:
curl --location 'localhost:8080/api/v1/calculate' \
--header 'Content-Type: application/json' \
--data '{"expression": "2*(2+2"}'Ответ:
{
"error": "mismatched parentheses"
}HTTP-код: 422
Все запросы и ошибки логируются в консоль с использованием библиотеки logrus. Логи содержат информацию о типе запроса, времени его обработки и ошибках.
Пример логов:
INFO[2024-12-20 10:00:00] HTTP Запрос POST /api/v1/calculate 200ms
ERROR[2024-12-20 10:01:00] HTTP Запрос POST /api/v1/calculate 500ms
INFO[2024-12-20 10:02:00] HTTP Запрос POST /api/v1/calculate 100ms
ERROR[2024-12-20 10:03:00] Internal server error
ERROR[2024-12-20 10:04:00] invalid expression
ERROR[2024-12-20 10:05:00] mismatched parentheses