使用Java做URL短连接还原长链接获取参数

为什么需要短连接

这个很多人能理解,也有人不能理解,因为url地址再长,好像也没有多少能超出浏览器的限制(老版本的IE限制最为严格,大概2000个字符,服务端 限制大小最小的是Nginx,不超过4K,不过因版本而异)。但是我想没几个人能写一个url加上参数超过2000个字符吧?

短连接流行的原因在于短,短了好记,当然了,一般也没人会记住,主要是复制、粘贴转发别人方便一些。一般都是域名加七八位字母数字组合,不会存在复制的时候少复制从而造成url不完整的情况。

短连接还原为长链接的方式

这个原理很简单,一般请求一个短连接,服务器收到后短连接后会去查询短连接后面几个字母,然后根据查询还原为长链接,这里会存在一个HTTP Redirect动作,把短连接重定向到长链接,完成一次完整的请求。所以,我们在代码中要做的就是发送短连接,然后抓取Redirect的长链接。

直接上关键代码:

java 复制代码
public static String expandUrl(String shortUrl) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(shortUrl).openConnection();
        connection.setInstanceFollowRedirects(true); // 启用自动重定向,短链接转长链接有一个301重定向的动作
        connection.setRequestMethod("HEAD");
        connection.setConnectTimeout(50000); //请求超时时间,我抓的是一个海外的站点,所以设置的超时时间很长,这个根据自身要求调解即可

        int status = connection.getResponseCode();
        if (status == HttpURLConnection.HTTP_MOVED_PERM ||
                status == HttpURLConnection.HTTP_MOVED_TEMP) {
            String location = connection.getHeaderField("Location");
            if (location != null) {
                return location; // 递归处理多层重定向
            }
        }
        return "";
    }

提取长链接中的参数:

我们一般拿长链接都是为了获取其中的参数。

比如短连接为:https://www.csdn.net/E7FndD

解析后的长链接为https://blog.csdn.net/love_99?spm=1011.2266.3001.5343

我们可能需要的是spm这个参数的值,所以写个方法拿出来即可,上代码:

java 复制代码
/**
    这个方法用来拆解url中的参数和值,保存为map<key,value>模式
*/

public static Map<String, String> parseParameters(String url)
            throws URISyntaxException, UnsupportedEncodingException {

        // 标准化URL处理
        URI uri = new URI(url.trim());
        String query = uri.getRawQuery();
        Map<String, String> params = new LinkedHashMap<>();

        if (query == null || query.isEmpty()) {
            return params;
        }

        // 拆分参数对
        String[] pairs = query.split("&");
        for (String pair : pairs) {
            int idx = pair.indexOf("=");
            String key = idx > 0 ?
                    URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
            String value = idx > 0 && pair.length() > idx + 1 ?
                    URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;

            if (!key.isEmpty()) {
                params.putIfAbsent(key, value); // 保留首次出现的参数
            }
        }
        return params;
    }

public static String getParaValue(){
                // 解析短连接得到长链接
                String longUrl = expandUrl(urlArray[i]);
                if (longUrl != null && !longUrl.isEmpty()) {
                    Map<String, String> params = parseParameters(longUrl); //解析长链接中的参数
                    if (!params.isEmpty()) {
                        String paraValue=params.get("spm");
                        return paraValue;
                    }
                }
        return "";
}

至此,短连接还原长链接获取参数就完成了,剩余的就是各位有需要的复制粘贴代码,然后按照自己的需求修改代码得到自己满意的答案了。

相关推荐
房开民17 分钟前
通俗总结 Octree(八叉树)
java·服务器·数据库
(Charon)19 分钟前
【C++面试】线程并发与异步:区别、实现原理及使用场景
开发语言·c++
AIFQuant32 分钟前
Python A股实时行情API接入:沪深股票数据与WebSocket推送实战
开发语言·python·websocket·金融·a股行情
木头科技34 分钟前
【AI 工程化第十五篇】Spring AI 流式输出高并发性能优化实战:SSE、背压、限流、缓存与灰度发布
人工智能·spring·性能优化
2302_8057710741 分钟前
Day23:POM设计模式(封装)
java·开发语言·设计模式
SL_staff43 分钟前
APS降本增效的关键:在JVS中实现‘人-机-料-法-环’全要素耦合调度
java·github·全栈
十年Java程序媛44 分钟前
Java String、StringBuilder、StringBuffer 底层原理|字符串拼接性能与线程安全
java·开发语言·spring boot·安全·面试
Cx330❀44 分钟前
Qt 界面美化指南:从零掌握 QSS 核心机制与工程实践
开发语言·qt·ui·性能优化·图形渲染
可乐ea1 小时前
2000 个智能体把 Agent 重写成 Rust:编排流水线拆解
开发语言·后端·rust·多智能体协作·ai编程助手·智能体编排·rust重写
SamDeepThinking1 小时前
CyclicBarrier的底层实现
java·后端·面试