短地址(ShortUrl)实例

本文介绍短网址的生成原理及实现方法,包括如何通过进制转换将长网址转化为短网址,以及如何反向解析。提供了具体的编码和解码算法,并讨论了数据库中短网址与长网址的映射关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

短地址,就是把长的URL转成短URL, 目前谷歌/新浪/百度/腾讯等都免费提供API服务。因调用次数限制或提供出去的url域名不是想要的,因此考虑自己实现。

短址本质上是实现了一个映射函数 f: X -> Y 。而这个映射函数必须同时具有两个特点:

1. 如果 x1 != x2, 则 f (x1) != f(x2);

2. 对于每一个 y, 能够找到唯一的一个 x 使得 f(x) = y;

对于任何的线性函数,比如 f(x) = 2x,都满足这样的条件。

实现:

短址的长度可以是任意位数,如6,7,8等,而每一位可以由 [a - z, A - Z, 0 - 9, - _] 总共 64 个字母/数字/符号组成的,所以6位的话,总共会有 64^6 ~= 几百亿种组合,足够使用。在百度地图服务中,短址长度为5,如:http://j.map.baidu.com/fSask

本文的思路通过进制之间的转换。规则如下:

0  → a

1  → b

...

25 → z

...

52 → 0

61 → 9

62 → -

63 → _

假设我们用数据库来保存长地址和短地址的映射,那么,在表 ShortURL 中,我们会有三列:

id, integer, auto-increment  //ID,自动增长

long, string, the long URL the user entered  //长URL

short, string, the shortened URL (or just the six characters)  //短URL

长地址生成短地址:

1. 记录写入表 ShortURL ,得到ID

2. 十进制的ID转换成64进制短串,如果约定6位短串的话,不够位数则在前面补0,例如ID=123123 对应的短串为 aaaEdZ

实现如下:

public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";

public static final int BASE = ALPHABET.length();

public static String encode(int num) {

StringBuilder str = new StringBuilder();

while (num > 0) {

str.insert(0, ALPHABET.charAt(num % BASE));

num = num / BASE;

}

int len = str.length();

for (int i = 1; i <= 6 - len; i++) {

str.insert(0, ALPHABET.charAt(0));

}

return str.toString();

}

短地址转长地址:

1. 通过短地址得到ID

2. 通过ID查 ShortURL ,得到长地址

实现如下:

public static int decode(String str) {

int id = 0;

int size = str.length();

for (int i = 0; i < size; i++) {

int value = ALPHABET.indexOf(str.charAt(i));

id += (int) (value * Math.pow(BASE, size - i - 1));

}

return id;

}

实例源码:test2-shorturl

转载于:https://my.oschina.net/superwind20/blog/1524155

### Java 使用 ShortURL API 示例 为了实现短链接的生成,可以通过调用第三方提供的ShortUrl服务API来完成这一操作。下面是一个基于Java语言的具体实例,展示了如何利用HTTP请求发送长链接并接收返回的短链接。 #### 准备工作 确保已引入必要的库文件,例如`HttpClient`用于发起网络请求: ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> ``` #### 创建 HTTP 请求客户端类 定义一个名为 `ShortUrlClient` 的类来进行API交互: ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class ShortUrlClient { private static final String SHORT_URL_API = "https://api.shorturl.example.com/create"; // 替换为实际API地址 public static void main(String[] args) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); try { createShortUrl(httpClient, "http://www.example-long-url.com"); } finally { httpClient.close(); } } /** * 发送POST请求创建短链接 */ public static void createShortUrl(CloseableHttpClient client, String longUrl) throws Exception { HttpPost postRequest = new HttpPost(SHORT_URL_API); String jsonInputString = "{\"long_url\": \"" + longUrl + "\"}"; StringEntity entity = new StringEntity(jsonInputString); postRequest.setEntity(entity); postRequest.setHeader("Accept", "application/json"); postRequest.setHeader("Content-type", "application/json"); try (CloseableHttpResponse response = client.execute(postRequest)) { HttpResponse httpResponse = response; int statusCode = httpResponse.getStatusLine().getStatusCode(); if (statusCode >= 200 && statusCode < 300) { System.out.println(EntityUtils.toString(response.getEntity())); } else { throw new RuntimeException("Failed with HTTP error code : " + statusCode); } } } } ``` 上述代码片段实现了向指定的服务端点提交JSON格式的数据包,其中包含了待处理的目标长链接字符串[^1]。当服务器成功接收到请求后,它会解析传入的内容,并按照内部逻辑转换成相应的短链形式再反馈给客户端程序。 注意:这里的API URL (`SHORT_URL_API`) 和参数结构需依据具体服务商的要求调整;此外还需考虑错误处理机制以及安全性方面的优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值