Skip to content

Latest commit

 

History

History
42 lines (25 loc) · 6.59 KB

README.md

File metadata and controls

42 lines (25 loc) · 6.59 KB

urlShortener

Краткое описание работы:

В качестве БД используется JSON-файл, в котором каждый элемент содержит в себе поля ID, address и short (идентификатор в БД, адрес исходный и адрес сокращённый).

  1. Чтобы запустить проект, необходимо прописать в той же папке, что и main.go, [go run main.go]
  2. Далее будут доступны три меню на выбор. Чтобы выбрать определённое, необходимо ввести цифру от 1 до 3, соответствующую нужному пункту меню:
  • 1 - Decode your URL - декодирует введённый нами URL адрес по алгоритму base62, который будет описан ниже. Например, из google.com в [localhost:9090//c], где [c] - сокращённая ссылка.
  • 2 - Create custom URL - создаёт короткую ссылку вида, которого мы захотим. Например, из google.com в [localhost:9090/the-most-popular-search], где [the-most-popular-search] - сокращённая (нет:)) ссылка, придуманная нами.
  • 3 - Redirect - перенаправление с введённого нами сокращённого адреса на исходный, если он есть в базе. Если нет, то будет "страница недоступна", а сайт не откроется. Чтобы осуществить переход, нужно в строке браузера ввести [localhost:9090/*сокращённая-ссылка*] (при запущенном коде и выбранном пункте Redirect!).

Подробное опсание работы

Decode your URL

Считываем данные из JSON-файла, расшифровываем их с помощью [json.Unmarshal] и проверяем, правильно ли расшифровались данные. Затем начинаем процедуру добавления адреса к считанной базе данных. Считываем исходный адрес. К данному адресу начинаем применять алгоритм шифрования base62:

  1. Предварительно перед считыванем данных из JSON-файла мы создаём словарь, в котором представлено 62 ключа и, значит, 62 элемента для шифрования. Каждый элемент словаря - это символ из последовательности [a..z, A..Z, 0..9]. Каждый ключ - это число от 0 до 62.
  2. При занесении в БД мы берём следующий идентификатор из JSON после последнего в предыдущей версии БД. Например, последний адрес в БД сейчас под ID == 54. Значит, новый добавится под ID == 55
  3. После всего этого переводим число (новый, следующий ID, в примере выше - 55) в 62-ичную систему счисления путём получения остатков от деления на 62 каждый раз.
  4. Переворачиваем полученный массив остатков наоборот и по ключам, соответствующим числам в ревёрснутом массиве, находим буквы для кода.

После полученный от алгоритма адрес добавляется в базу данных новая база записывается в JSON-файл. Всё, теперь можно использовать данную ссылку в Redirect.

Create custom URL

Считываем данные из JSON-файла, расшифровываем их с помощью [json.Unmarshal] и проверяем, правильно ли расшифровались данные. Затем начинаем процедуру добавления адреса к считанной базе данных. Считываем исходный адрес. Затем программа предлагает ввести придуманный нами кастомный адрес. Вводим.

После полученный от алгоритма адрес добавляется в базу данных новая база записывается в JSON-файл. Всё, теперь можно использовать данную ссылку в Redirect.

Redirect

Поднимается сервер на порту 9090. Чтобы перейти по ссылке, в адресной строке браузера мы вводим [localhost:9090/*сокращённая-ссылка*] (например, опять же [localhost:9090/the-most-popular-search]). Осуществляется переход по введённому адресу с последующим поиском PATH от данного URL: функция [findURL] проходится по всей считанной из JSON-файла БД, находит нужный адрес, берёт из БД настоящую (исходную) ссылку и перенаправляет на неё.

Вот и всё описание работы программы.

Усложнения

  1. Добавлена валидация URL в функции validateURL. Сначала адрес парсится. Если он не имеет в своём составе SCHEME в виде [http://], то добавляем её. Парсим второй раз для окончательной проверки валидности. Адрес обязательно должен быть как минимум двухуровневый (домен верхнего и второго уровней), поэтому проверяем, чтобы точка в адресе была не в начале или в конце, а в середине. Также HOST не должен пустовать (адреса вроде [src/RoFlURL] не пройдут). Иначе паникуем => возникает ошибка и код ломается.
  2. Добавлена возможность создавать кастомные. Об этом было рассказано выше.