ВНИМАНИЕ! Информация для разработчиков из Avito, которые будут проверять это задание. Это новая версия (я начал изучать SQL) приложения. Старая версия, которую я прикрепил к заявке, тут: https://github.com/LeoStars/urlShortenerJSON. Они отличаются разным подходом и разными БД.
В качестве БД используется PostreSQL=база данных, в котором каждый элемент содержит в себе поля ID, address и short (идентификатор в БД, адрес исходный и адрес сокращённый).
- Чтобы запустить проект, необходимо прописать в той же папке, что и main.go, [
go run .
] - Далее в зависимости от того, что нам необходимо:
- 1 - Декодировать введённый нами URL адрес по алгоритму base62, который будет описан ниже. Например, из google.com в [
localhost:8080/c
], где [c
] - сокращённая ссылка. Для этого в командной строке пишем: [curl -X POST -d *JSON-структура* http://localhost:8080/decode
]. Например, [curl -X POST -d "{\"address\": \"www.google.com\"}" http://localhost:8080/decode
]. - 2 - Создать короткую ссылку вида, которого мы захотим. Например, из google.com в [
localhost:8080/the-most-popular-search
], где [the-most-popular-search
] - сокращённая (нет:)) ссылка, придуманная нами. Для этого в командной строке пишем: [curl -X POST -d *JSON-структура* http://localhost:8080/custom
]. Например, [curl -X POST -d "{\"address\": \"vk.com\", \"short\": \"tellmeabout\"}" http://localhost:8080/custom
] - 3 - Redirect - перенаправление с введённого нами сокращённого адреса на исходный, если он есть в базе. Если нет, то будет "страница недоступна", а сайт не откроется. Чтобы осуществить переход, нужно в строке браузера ввести [
localhost:8080/*сокращённая-ссылка*
] (при запущенном коде и выбранном пункте Redirect!). Либо в командной строке прописать [curl -i localhost:8080/*сокращенная ссылка*
]. К примеру, [curl -i localhost:9090/the-most-popular-search
].
Берём структуру с исходным адресом из командной строки, расшифровываем её с помощью создания Decoder'а и проверяем, правильно ли расшифровались данные. Затем начинаем процедуру добавления адреса к базе данных. К полученному после расшифровки адресу начинаем применять алгоритм шифрования base62:
- Создаём словарь, в котором представлено 62 ключа и, значит, 62 элемента для шифрования. Каждый элемент словаря - это символ из последовательности [a..z, A..Z, 0..9]. Каждый ключ - это число от 0 до 62.
- При занесении в БД мы берём следующий идентификатор после последнего в предыдущей версии БД. Например, последний адрес в БД сейчас под ID == 54. Значит, новый добавится под ID == 55
- После всего этого переводим число (новый, следующий ID, в примере выше - 55) в 62-ичную систему счисления путём получения остатков от деления на 62 каждый раз.
- Переворачиваем полученный массив остатков наоборот и по ключам, соответствующим числам в ревёрснутом массиве, находим буквы для кода.
После полученный от алгоритма адрес добавляется в базу данных. Всё, теперь можно использовать данную ссылку в Redirect.
Берём структуру с адресом исходным и придуманным нами из командной строки, расшифровываем её с помощью создания Decoder'а и проверяем, правильно ли расшифровались данные. Затем начинаем процедуру добавления адреса к базе данных.
То же самое, что и с [/decode
], но сокращёенная ссылка придумана нами, а не сделана с помощью base62. Всё, теперь можно использовать данную ссылку в Redirect.
Поднимается сервер на порту 8080. Чтобы перейти по ссылке, в адресной строке браузера мы вводим [localhost:8080/*сокращённая-ссылка*
] (например, опять же [localhost:8080/the-most-popular-search
]). Осуществляется переход по введённому адресу с последующим поиском PATH от данного URL. Находим в БД нужный адрес, берём из БД настоящую (исходную) ссылку и перенаправляем на неё.
Redirect работает не с JSON. Но могу переписать на Request в формате JSON-структуры (то есть отправлять на сервер ссылку в виде [avi.to/*сокращение*
]
Вот и всё описание работы программы.
- Добавлена валидация URL в функции validateURL. Сначала адрес парсится. Если он не имеет в своём составе SCHEME в виде [
http://
], то добавляем её. Парсим второй раз для окончательной проверки валидности. Адрес обязательно должен быть как минимум двухуровневый (домен верхнего и второго уровней), поэтому проверяем, чтобы точка в адресе была не в начале или в конце, а в середине. Также HOST не должен пустовать (адреса вроде [src/RoFlURL
] не пройдут). Иначе паникуем => возникает ошибка и код ломается. - Добавлена возможность создавать кастомные адреса. Об этом было рассказано выше.