如何实现 Java 长链接转化为短链接

在互联网时代,短链接的使用变得越来越普遍。短链接不仅节省了字符长度,而且在社交媒体和各种应用中,能够带来更好的可读性和分享体验。本篇文章将深入探讨如何在 Java 中实现长链接转化为短链接的功能,适合刚入行的小白学习。

整体流程

下面是实现长链接转化为短链接的主要步骤,表格形式展示如下:

步骤说明
1创建短链接服务接口
2实现链接映射的持久化存储
3实现生成短链接的逻辑
4提供短链接的重定向
5编写单元测试和运行程序

详细步骤

1. 创建短链接服务接口

我们首先需要一个简单的接口来定义我们的服务。代码如下:

public interface LinkService {
    String shorten(String longUrl); // 接收一个长链接并返回短链接
    String retrieve(String shortUrl); // 根据短链接返回原长链接
}
  • 1.
  • 2.
  • 3.
  • 4.
2. 实现链接映射的持久化存储

为了存储长链接和短链接的对应关系,通常会使用数据库或内存映射来保存。这里我们使用一个 HashMap 作为简易存储。

import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class LinkServiceImpl implements LinkService {
    private Map<String, String> urlDatabase = new HashMap<>(); // 存储映射
    private final String BASE_URL = " // 短链接的基础 URL
    private int idCounter = 0; // 用于生成唯一 ID

    @Override
    public String shorten(String longUrl) {
        String shortUrl = BASE_URL + encodeUrl(idCounter++); // 生成短链接
        urlDatabase.put(shortUrl, longUrl); // 存入映射
        return shortUrl;
    }

    @Override
    public String retrieve(String shortUrl) {
        return urlDatabase.get(shortUrl); // 从映射中获取长链接
    }

    private String encodeUrl(int id) {
        return Base64.getUrlEncoder().encodeToString(Integer.toString(id).getBytes()).replace("=", ""); // 编码 ID
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
3. 生成短链接的逻辑

shorten方法中,我们使用一个计数器作为唯一标识,基于它生成短链接。同时采用 Base64 编码格式以确保生成的短链接可用。我们存储长链接和短链接的映射关系。

4. 提供短链接的重定向

当用户使用短链接时,我们需要重定向他们到原长链接。这个逻辑可以在一个控制器中实现:

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LinkController {
    private LinkService linkService;

    public LinkController(LinkService linkService) {
        this.linkService = linkService; // 初始化服务
    }

    public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String shortUrl = request.getRequestURI(); // 获取请求的短链接
        String longUrl = linkService.retrieve(shortUrl); // 从服务中获取长链接
        if (longUrl != null) {
            response.sendRedirect(longUrl); // 重定向到长链接
        } else {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 返回 404 错误
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
5. 编写单元测试和运行程序

可以通过单元测试来验证我们编写的短链接服务是否符合预期。我们可以使用 JUnit 一类的框架来实现。

import static org.junit.Assert.*;
import org.junit.Test;

public class LinkServiceImplTest {

    @Test
    public void testShortenAndRetrieve() {
        LinkService linkService = new LinkServiceImpl();
        String longUrl = "
        String shortUrl = linkService.shorten(longUrl); // 生成短链接
        assertEquals(longUrl, linkService.retrieve(shortUrl)); // 验证映射是否正确
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

类图和序列图

我们可以用 UML 类图和序列图来更好地理解内部结构和操作。

类图
«interface» LinkService +String shorten(String longUrl) +String retrieve(String shortUrl) LinkServiceImpl -Map urlDatabase -String BASE_URL -int idCounter +String shorten(String longUrl) +String retrieve(String shortUrl) LinkController +void redirect(HttpServletRequest request, HttpServletResponse response)
序列图
LinkService LinkController User LinkService LinkController User Request short URL shorten(longUrl) Returns shortUrl Request short URL retrieve(shortUrl) Returns longUrl Redirects to longUrl

结尾

通过上述步骤,我们成功实现了 Java 中长链接转化为短链接的功能。这不仅涉及到了基本的 Java 编程,也让我们学习到了如何构建接口以及实现简单的 URL 重定向功能。希望这篇文章对刚入行的你大有裨益,鼓励你继续深入学习和探索更多的编程技术!