7. Спроектировать и реализовать сервис для сокращения URL-адресов? #
Спойлеры к решению
Подсказки
- Для реализации сервиса сокращения URL можно использовать хеширование или создание уникальных идентификаторов.
- Можно использовать структуру данных, которая будет хранить пары исходный URL → сокращенный URL.
- Каждый раз, когда пользователь вводит длинный URL, мы генерируем уникальный идентификатор для этого URL и сохраняем его в базе данных или памяти.
- Для хранения данных можно использовать Map, где ключом будет уникальный идентификатор, а значением — оригинальный URL.
- После этого, при запросе по сокращенному URL, сервис должен возвращать оригинальный URL.
Решение
Для начала реализуем простой сервис сокращения URL-адресов с использованием Map для хранения данных и генерации коротких URL.
Шаг 1. Создадим интерфейс сервиса
public interface URLShorteningService {
String shortenURL(String originalURL);
String getOriginalURL(String shortenedURL);
}
Шаг 2. Реализуем сервис
import java.util.HashMap;
import java.util.Map;
public class URLShorteningServiceImpl implements URLShorteningService {
private static final String BASE_URL = "http://short.ly/";
private Map<String, String> urlStorage = new HashMap<>();
private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final int URL_LENGTH = 6; // Длина сокращенного URL
@Override
public String shortenURL(String originalURL) {
String shortURL = generateShortURL();
urlStorage.put(shortURL, originalURL);
return BASE_URL + shortURL;
}
@Override
public String getOriginalURL(String shortenedURL) {
String shortURL = shortenedURL.replace(BASE_URL, "");
return urlStorage.getOrDefault(shortURL, null);
}
// Генерация случайного короткого URL
private String generateShortURL() {
StringBuilder shortURL = new StringBuilder();
for (int i = 0; i < URL_LENGTH; i++) {
int index = (int) (Math.random() * CHARACTERS.length());
shortURL.append(CHARACTERS.charAt(index));
}
return shortURL.toString();
}
}
Шаг 3. Пример использования сервиса
public class Main {
public static void main(String[] args) {
URLShorteningService urlShorteningService = new URLShorteningServiceImpl();
// Сокращение URL
String originalURL = "https://www.example.com/long-url";
String shortenedURL = urlShorteningService.shortenURL(originalURL);
System.out.println("Shortened URL: " + shortenedURL);
// Получение оригинального URL
String retrievedURL = urlShorteningService.getOriginalURL(shortenedURL);
System.out.println("Original URL: " + retrievedURL);
}
}
** Ключевые моменты:**
- Класс
URLShorteningServiceImpl
реализует логику сокращения URL и возвращения оригинала. - Генерация короткого URL происходит с использованием случайных символов, из которых формируется строка заданной длины.
- Для хранения пары оригинальный URL → сокращенный URL используется Map.
- Метод
shortenURL
генерирует сокращенный URL, сохраняет его в хранилище и возвращает. - Метод
getOriginalURL
извлекает оригинальный URL из хранилища по сокращенному URL.
Такой сервис будет работать для базового сокращения URL, а также может быть расширен дополнительными функциями, например:
- Проверка на дубликаты сокращенных URL.
- Хранение статистики по кликам.
- Сроки действия сокращенных URL.