Java:如何轻松检查URL是否已缩短?
如果我有这样的一般url(不限于推特或谷歌):
http://t.co/y4o14bI
有没有一种简单的方法来检查这个url是否被缩短?
在上面的例子中,我作为一个人当然可以看到它是短暂的,但是有一种自动而优雅的方式吗?
您可以对URL进行请求,看看是否重定向,如果是,则假设它是缩短服务。 为此,您必须阅读HTTP状态代码。
另一方面,您可以将某些URL缩短服务(t.co,bit.ly等)列入白名单,并假设缩短了到这些域的所有链接。
第一种方法的缺点是不确定,一些站点在内部使用重定向。 第二种方法的缺点是你必须不断添加缩短服务,尽管只有少数被广泛使用。
一个信号可能是请求URL并查看它是否导致重定向到另一个域。 但是,如果没有对“缩短”意味着什么的良好定义,就没有通用的方法。
如果您知道可用于缩短url的所有域名,请检查其是否包含:
String[] domains = {"bit.ly", "t.co"...}; for(String domain : domains){ if(url.startsWith("http://" + domain)){ return true; } } return false;
你不能:你必须按照假设工作。
假设:
-
www
是否存在于url中。 - 服务器名称是以有效域(例如
com
,edu
等)co.xx
还是具有co.xx
,其中xx
是有效的国家或组织代码。
您可以根据其他url缩短链接添加更多假设。
你不能。
您只能检查是否列出了几个缩短程序并检查URL是否以它开头 。
您还可以尝试检查url是否短于给定长度(并包含路径/查询字符串),但是某些缩短程序(例如tinyurl)可能比正常站点具有更长的URL(aol.com)
我更喜欢已知的缩短剂列表。
这是你可以用Java,groovy等做的。
- 获取您要测试的url;
- 使用HttpURLConnection打开url
- 检查响应代码
- 如果它是一个有效的代码,例如200,你可以从连接对象中检索长forms的url字符串(如果它已缩短)或返回原始forms(如果不是)。
我们都喜欢看到一些代码不是我们。 它原油,但嘿!
String addr = "http://t.co/y4o14bI"; URL url = new URL(addr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { String longUrl = connection.url; System.out.println(longUrl); } else { // You decide what you want to do here! }
其实,你作为一个人,不可能。 你知道它缩短的唯一方法是它是一个t.co域。 y4o14bI
可能是您所知道的CMS标识符。
最好的方法是使用已知的缩短url列表,然后查找。
即便如此,你也会有问题。 我将bit.ly用于个人域名wtn.gd
所以http://wtn.gd/random也是一个缩短的URL。
您可以执行HTTP HEAD请求,并检查301/302?
如果您请求这样的URL,您的HttpCLient应该会收到HTTP重定向而不是HTML页面。 这不是证据,而是至少一个暗示。
评估URL并寻找一些线索:
-
路径符合某些标准
- 只有一步(即不是多个斜杠)
- 不以文件扩展名结尾
- 不超过X个字符(需要评估各种URL缩短服务并调整最大令牌长度的上限)
-
HttpUrlConnection返回重定向responseCode(即301,302)