RESTful Web Service on Jersey. Testing task to Java Developer position for Sintez-AT Company.
Technical assignment:
Сокращатель ссылок Необходимо разработать HTTP-сервис, который генерирует короткие ссылки.Описание
В сервисе должна быть реализована следующая функциональность:
Генератор ссылок Ресурс /generate должен обрабатывать POST-запрос, содержащий оригинальную ссылку, и генерировать короткую ссылку. Оригинальная ссылка передается в теле POST-запроса в поле “original” JSON-объекта. Сгенерированная короткая ссылка передается в теле ответа в поле “link” JSON-объекта. Сгенерированная короткая ссылка должна иметь формат /l/{some-short-name}, то есть не должна содержать адрес сервера, где some-short-name - идентификатор ссылки. Алгоритм генерации этого идентификатора и его формат остается на усмотрение автора. Пример запроса: POST /generate Пример тела запроса: { “original”: “https://some.com/tert/url?param=1” } Пример ответа: { “link”: “/l/short-name” }
Редирект Ресурс /l/{short-name} должен осуществлять редирект на оригинальный url. Параметры пути запроса:
short-name - идентификатор ссылки Пример запроса: GET /l/short-name
Предлагаем подумать, каким образом можно оптимизировать работу с ссылками, по которым происходит много переходов.
Статистика 3.1 Статистика по конкретным ссылкам Ресурс /stats/{short-name} должен обрабатывать GET-запрос и возвращать статистику переходов по конкретной ссылке. Параметры пути запроса:
some-short-name - идентификатор ссылки В ответе сервиса должен содержаться JSON-объект со следующими полями:
link - сгенерированная короткая ссылка
original - оригинальная ссылка
rank - место ссылки в топе запросов
count - число запросов по короткой ссылке Пример запроса: GET /stats/some-short-name Пример ответа: { “link”: “/l/short-name”, “original”: “http://some.com/tert/url” “rank”: 1, “count”: 4356 } 3.2 Рейтинг ссылок Ресурс /stats должен обрабатывать GET-запрос и возвращать статистику запросов с сортировкой по частоте запросов по убыванию и возможностью постраничного отображения. Параметры строки запроса:
page - номер страницы
count - число записей, отображаемых на странице, максимальное возможное значение 100 (включительно) В ответе сервиса должен содержаться массив из JSON-объектов, описанных в разделе 3.1 Статистика по конкретным ссылкам. Пример запроса: GET /stats?page=1&count=2 Пример ответа: [ { “link”: “/l/short-name”, “original”: “http://server.com/tert/url” “rank”: 1, “count”: 4356 }, { “link”: “/l/some-another-short-name”, “original”: “http://another-server.com/some/url” “rank”: 2, “count”: 43563 } ]
Требования к сервису
В качестве фреймворка использовать Jersey
Запуск сервера должеен производиться из war файла в вебсервисе томкат(можно использовать докер если так удобней)
Необходимо покрыть сервис Unit-тестами. Полнота покрытия остается на усмотрение автора решения.
Приложение должно собираться с использованием Apache Maven.
По возможности необходимо придерживаться REST-архитектуры.
В качестве бд можно выбрать любую удобную(например postgres)
You can launch this web service in several ways.
You need to install docker on your host. Next, create docker-compose.yml
with the following content:
version: '3'
services:
short_url_war:
image: privdim/short_url_service
ports:
- 8080:8080
links:
- "db"
depends_on:
- db
db:
image: privdim/short_url_db
ports:
- 5432:5432
Next, you need to navigate in the terminal to the directory where you created docker-compose.yml.
And enter the command docker-compose up
. Сongratulations, you have launched the application!
Next, you can send a POST request to http://YOUR_HOST_IP:8080/Short-Uri-Web-Service/generate that create your first short URL.
You need to install tomcat on your host and postgreSQL. Next, you must download this repository.
Configure tomcat configuration. Configure a database connection in src/main/resources/hibernate.cfg.xml
.
Now you can run the application.
You need to install docker on your host. Next, you must download this repository.
Configure a database connection in src/main/resources/hibernate.cfg.xml
.
Next, you need to enter the command in the terminal while in the root of the project:
docker-compose up
. And that's it, your application has started.
This application has multiple entry points:
- POST /generate - generate short url.
- GET /l/{short-url} - redirect to original url.
- GET /stats/{short-url} - statistics for this short url.
- GET /stats?page={page-number}&count={json-object-count-to-page} - returns statistics for urls.
Request examples:
POST
request
{
"original": "https://www.google.com/maps/preview",
}
response
{
"link": "/l/3"
}
GET
redirects you to the address: https://www.google.com/maps/preview
GET
response
{
"shortUrl": "/l/3",
"originalUrl": "https://www.google.com/maps/preview",
"callcount": "1",
"rank": "1"
}
GET
response
{
"shortUrl": "/l/3",
"originalUrl": "https://www.google.com/maps/preview",
"callcount": "1",
"rank": "1"
},
{
"shortUrl": "/l/4",
"originalUrl": "https://hub.docker.com",
"callcount": "0",
"rank": "2"
}