什麼是長連接?
HTTP1.1協議規定了web地址默認保持長連接(HTTP persistent connection ,也有翻譯爲持久連接),所以在web服務端獲取到的鏈接都只能是原始長連接。
什麼是短連接?
短連接(short-url),顧名思義就是在形式上比較短的鏈接,可能很多朋友都已經不再陌生,特別是在微博應用中十分普遍,比如,當我們在騰訊、新浪微博發微博時有時發很長的網址連接,但由於微博只限制140個字,所以微博就自動把您發的長連接給轉換成短連接了。無可否認在微博和手機短信提醒等限制字數的地方來使用短網址,的確是一個不錯的方案。
長連接和短連接轉換接口
新浪短鏈接接口:http://lnurl.cn/sina/short-api?link=http://www.baidu.com
微信短鏈接接口:http://lnurl.cn/weixin/short?link=http://www.baidu.com
接口使用說明:
1、在線使用
將API地址中 "http://www.baidu.com" 的部分換成自己的長連接,然後複製完整地址前往瀏覽器中粘貼打開就能生成了。(簡而言之就是更換url後面的鏈接)
2、請求接口
如果你的量比較大,一條一條轉換太麻煩了,需要批量生成的話,可以將API接口對接到程序中請求生成,請求示例如下。
PHP請求示例:
$url = 'http://www.baidu.com'; $api_url = 'http://lnurl.cn/sina/short-api?url_long=http://www.baidu.com; $short_url = file_get_contents($api_url); echo $short_url;
Java請求示例:
public static void main(String path[]) throws Exception { URL u = new URL("http://lnurl.cn/sina/short-api?url_long=http://www.baidu.com"); InputStream in = u.openStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { byte buf[] = new byte[1024]; int read = 0; while ((read = in .read(buf)) > 0) { out.write(buf, 0, read); } } finally { if ( in != null) { in .close(); } } byte b[] = out.toByteArray(); System.out.println(new String(b, "utf-8")); }
Python請求示例:
import urllib, urllib2, sys host = 'http://lnurl.cn' path = '/sina/short-api' method = 'GET' querys = 'url_long=http%3A%2F%2Fwww.baidu.com' bodys = {} url = host + path + '?' + querys request = urllib2.Request(url) response = urllib2.urlopen(request) content = response.read() if (content): print(content)
注意事項:
1、調用API接口時,只需將 “http://www.baidu.com”換成需要縮短的長鏈接即可。
2、接口支持鏈接中帶參數,但要注意的是當鏈接中出現 & 符號時,請用 %26 代替(或者使用url編碼),否則參數可能會丟失。
3、更換鏈接時,必須要以http(s)://開頭,否則可能會導致短網址生成失敗或者生成的短網址無法跳轉訪問原網站。
常見問題:
1、長鏈接轉換後,爲什麼結尾的參數丟失了?
答:因爲長鏈接中含有特殊字符,需要將url編碼後再使用接口生成。
2、接口沒有返回結果,是什麼情況?
答:有些時候接口返回數據會有延遲,超時未返回即生成失敗,也就不會返回結果;或者是因爲原鏈接被封了。
3、生成的短連接有效期是多久?有沒有訪問次數限制?
答:生成的短連接(t.cn&url.cn)是永久有效的,沒有點擊次數限制,可以放心使用。
算法原理
算法一
1) 將長網址md5生成32位簽名串,分爲4段, 每段1個字節(即8位);
2) 對這四段循環處理, 取4個字節(32位), 將他看成16進制串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理;
3) 這30位分成6段, 每5位的數字作爲字母表的索引取得特定字符, 依次進行獲得6位字符串;
4) 總的md5串可以獲得4個6位串; 取裏面的任意一個就可作爲這個長url的短url地址;
算法二
把數字和字符組合做一定的映射,就可以產生唯一的字符串,如第62個組合就是aaaaa9,第63個組合就是aaaaba,再利用洗牌算法,把原字符串打亂後保存,那麼對應位置的組合字符串就會是無序的組合。
把長網址存入數據庫,取返回的id,找出對應的字符串,例如返回ID爲1,那麼對應上面的字符串組合就是bbb,同理 ID爲2時,字符串組合爲bba,依次類推,直至到達62種組合後纔會出現重複的可能,所以如果用上面的62個字符,任意取6個字符組合成字符串的話,你的數據存量達到500多億後纔會出現重複的可能。