Тестовое задание по осенней стажировке от компании РЕЛЭКС.
RESTfull API service для обработки последовательности чисел.
Программа должна позволят считать массив целых чисел из текстового файла, обработать и выдать необходимые результаты. Результаты запрашиваются по средством REST-запросов, информация о файле передается в виде json (например):
{
"file_path": "C:/test_data/10m.txt"
}
Числа в файле разделены между собой с помощью специального символа "\n" (каждое число на новой строке). В сервисе необходимо реализовать следующие операции (REST-запросы), возвращающие:
- максимальное число в файле;
- минимальное число в файле;
- медиана;
- среднее арифметическое значение;
- самая длинная последовательность идущих подряд чисел, которая увеличивается;
- самая длинная последовательность идущих подряд чисел, которая уменьшается.
Тип запрашиваемой операции может передаваться как параметр в json ("operation": "get_max_value"), так и определяться из URL запроса (http://../get_max_value)
Результат выдается так же в виде json (пример):
{
"max_value": "777777"
}
SpringBoot
Java 11
Swagger
Docker
-
Get maximum value in file:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_max_value -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_max_value -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"max_value":49999978}
-
Get minimum value in file:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_min_value -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_min_value -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"min_value":-49999996}
-
Get median:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_median -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_median -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"median":25216.0}
-
Get Arithmetic mean:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_arithmetic_mean -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_arithmetic_mean -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"arithmetic_mean":7364.0}
-
Get longest sequence of consecutive numbers that increases: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_max_asc_sequence -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_max_asc_sequence -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"sequences_ASC":{"1":[-48190694,-47725447,-43038241,-20190291,-17190728,-6172572,8475960,25205909,48332507,48676185]}}
-
Get longest sequence of consecutive numbers that decreases: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/get_max_desc_sequence -d '{"path_file":"C:/test_data/10m.txt"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/get_max_desc_sequence -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"sequences_DESC":{"1":[47689379,42381213,30043880,12102356,-4774057,-5157723,-11217378,-23005285,-23016933,-39209115,-49148762]}}
-
Get requested operation:
-
get_max_value:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_max_value"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_max_value</operation></data>'
Response:{"max_value":49999978}
-
get_min_value:
JSON type:curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_min_value"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_min_value</operation></data>'
Response:{"min_value":-49999996}
-
get_median: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_median"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_median</operation></data>'
Response:{"median":25216.0}
-
get_arithmetic_mean: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_arithmetic_mean"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_arithmetic_mean</operation></data>'
Response:{"arithmetic_mean":7364.0}
-
get_max_asc_sequence: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_max_asc_sequence"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_max_asc_sequence</operation></data>'
Response:{"sequences_ASC":{"1":[-48190694,-47725447,-43038241,-20190291,-17190728,-6172572,8475960,25205909,48332507,48676185]}}
-
get_max_desc_sequence: JSON type:
curl -H 'Content-Type: application/json' -s -XPOST http://localhost:8081/api/ -d '{"path_file":"C:/test_data/10m.txt","operation":"get_max_desc_sequence"}'
XML type:curl -H 'Content-Type: application/xml' -s -XPOST http://localhost:8081/api/ -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>get_max_desc_sequence</operation></data>'
Response:{"sequences_DESC":{"1":[47689379,42381213,30043880,12102356,-4774057,-5157723,-11217378,-23005285,-23016933,-39209115,-49148762]}}
JSON type input, XML type output:
curl -H 'Content-Type: application/json' -H 'accept: application/xml' -s -XPOST http://localhost:8081/api/get_max_value -d '{"path_file":"C:/test_data/10m.txt"}'
Response:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><data><max_value>4999997</max_value></data>
XML type input, XML type output:curl -H 'Content-Type: application/xml' -H 'accept: application/xml' -s -XPOST http://localhost:8081/api/get_max_value -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><data><max_value>4999997</max_value></data>
XML type input, JSON type output:curl -H 'Content-Type: application/xml' -H 'accept: application/json' -s -XPOST http://localhost:8081/api/get_max_value -d '<data><path_file>C:/test_data/10m.txt</path_file><operation>null</operation></data>'
Response:{"max_value":49999978}
JSON type input, JSON type output:curl -H 'Content-Type: application/json' -H 'accept: application/json' -s -XPOST http://localhost:8081/api/get_max_value -d '{"path_file":"C:/test_data/10m.txt"}'
Response:{"max_value":49999978}
Таким образом:
- максимальное число = 49999978
- минимальное число = -49999996
- медиана = 25216.0
- среднее арифметическое значение = 7364.0
- самая длинная последовательность идущих подряд чисел, которая увеличивается = [-48190694,-47725447,-43038241,-20190291,-17190728,-6172572,8475960,25205909,48332507,48676185]
- самая длинная последовательность идущих подряд чисел, которая уменьшается = [47689379,42381213,30043880,12102356,-4774057,-5157723,-11217378,-23005285,-23016933,-39209115,-49148762]
Build gradle:
gradlew clean build
Build project image with docker:
docker image build ./ -t relex-image
Running the docker container container with an images:
docker run -p 8081:8081 -d --name relex-service relex-image
Stopping a docker container:
docker stop relex-service
Для того, чтобы посмотреть все доступные пути энд-поинтов и их модели данных, на сервере подключен Swagger.
Чтобы увидеть страницу документации, нужно запустить сервер и перейти по пути http://localhost:8081/swagger-ui.html#