什么是長連接烁巫?
HTTP1.1協(xié)議規(guī)定了web地址默認(rèn)保持長連接(HTTP persistent connection 奢人,也有翻譯為持久連接)闸昨,所以在web服務(wù)端獲取到的鏈接都只能是原始長連接风纠。
什么是短連接况鸣?
短連接(short-url),顧名思義就是在形式上比較短的鏈接竹观,可能很多朋友都已經(jīng)不再陌生镐捧,特別是在微博應(yīng)用中十分普遍,比如臭增,當(dāng)我們在騰訊懂酱、新浪微博發(fā)微博時有時發(fā)很長的網(wǎng)址連接,但由于微博只限制140個字誊抛,所以微博就自動把您發(fā)的長連接給轉(zhuǎn)換成短連接了列牺。無可否認(rèn)在微博和手機短信提醒等限制字?jǐn)?shù)的地方來使用短網(wǎng)址,的確是一個不錯的方案。
長連接和短連接轉(zhuǎn)換接口
新浪短鏈接接口:http://lnurl.cn/sina/short-api?link=http://www.baidu.com
微信短鏈接接口:http://lnurl.cn/weixin/short?link=http://www.baidu.com
接口獲取流程
1祭椰、打開短連接接口獲取地址:http://lnurl.cn/api
2、進入頁面后他嚷,點擊“立即開通”獲取接口授權(quán)key
3默刚、注冊賬后獲取接口key
4、獲取接口
接口使用說明:
1逃魄、在線使用
將API地址中?"http://www.baidu.com"?的部分換成自己的長連接荤西,然后復(fù)制完整地址前往瀏覽器中粘貼打開就能生成了。(簡而言之就是更換url后面的鏈接)
2伍俘、請求接口
如果你的量比較大邪锌,一條一條轉(zhuǎn)換太麻煩了,需要批量生成的話癌瘾,可以將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妨退、調(diào)用API接口時妇萄,只需將 “http://www.baidu.com”換成需要縮短的長鏈接即可。
2咬荷、接口支持鏈接中帶參數(shù)冠句,但要注意的是當(dāng)鏈接中出現(xiàn) & 符號時,請用 %26 代替(或者使用url編碼)幸乒,否則參數(shù)可能會丟失懦底。
3、更換鏈接時罕扎,必須要以http(s)://開頭聚唐,否則可能會導(dǎo)致短網(wǎng)址生成失敗或者生成的短網(wǎng)址無法跳轉(zhuǎn)訪問原網(wǎng)站。
常見問題:
1腔召、長鏈接轉(zhuǎn)換后杆查,為什么結(jié)尾的參數(shù)丟失了?
答:因為長鏈接中含有特殊字符宴咧,需要將url編碼后再使用接口生成根灯。
2、接口沒有返回結(jié)果掺栅,是什么情況烙肺?
答:有些時候接口返回數(shù)據(jù)會有延遲,超時未返回即生成失敗氧卧,也就不會返回結(jié)果桃笙;或者是因為原鏈接被封了。
3沙绝、生成的短連接有效期是多久搏明?有沒有訪問次數(shù)限制鼠锈?
答:生成的短連接(t.cn&url.cn)是永久有效的,沒有點擊次數(shù)限制星著,可以放心使用购笆。
算法原理
算法一
1) 將長網(wǎng)址md5生成32位簽名串,分為4段, 每段1個字節(jié)(即8位);
2) 對這四段循環(huán)處理, 取4個字節(jié)(32位), 將他看成16進制串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理;
3) 這30位分成6段, 每5位的數(shù)字作為字母表的索引取得特定字符, 依次進行獲得6位字符串;
4) 總的md5串可以獲得4個6位串; 取里面的任意一個就可作為這個長url的短url地址;
算法二
把數(shù)字和字符組合做一定的映射,就可以產(chǎn)生唯一的字符串,如第62個組合就是aaaaa9,第63個組合就是aaaaba,再利用洗牌算法,把原字符串打亂后保存虚循,那么對應(yīng)位置的組合字符串就會是無序的組合同欠。
把長網(wǎng)址存入數(shù)據(jù)庫,取返回的id,找出對應(yīng)的字符串,例如返回ID為1,那么對應(yīng)上面的字符串組合就是bbb,同理 ID為2時横缔,字符串組合為bba,依次類推,直至到達(dá)62種組合后才會出現(xiàn)重復(fù)的可能铺遂,所以如果用上面的62個字符,任意取6個字符組合成字符串的話茎刚,你的數(shù)據(jù)存量達(dá)到500多億后才會出現(xiàn)重復(fù)的可能襟锐。