最近在作短信業務的時候,有個內容裏含有url連接,咱們拼裝好後以爲url巨長,想起不少商家都是用短連接的方式,我就找了找原理及簡單的應用,下面會先講一下簡單調用第三方接口的實現思路和簡要代碼,而後再講一下真實的裏面的原理和一些簡單的實現思路。php
常常看到的短連接在微博,微信,短信中能夠看到,百度雲也有分享生成短連接的方式。對於這樣好處我以爲有三點:html
一、微博限制字數爲140字一條,那麼若是咱們須要發一些鏈接上去,可是這個鏈接很是的長,以致於將近要佔用咱們內容的一半篇幅,這確定是不能被容許的,因此短網址應運而生了。算法
二、短網址能夠在咱們項目裏能夠很好的對開放級URL進行管理。有一部分網址能夠會涵蓋性、暴力、廣告等信息,這樣咱們能夠經過用戶的舉報,徹底管理這個鏈接將不出如今咱們的應用中,應爲一樣的URL經過加密算法以後,獲得的地址是同樣的。json
三、咱們能夠對一系列的網址進行流量,點擊等統計,挖掘出大多數用戶的關注點,這樣有利於咱們對項目的後續工做更好的做出決策。api
各類第三方API提供商也是不只僅提供了短連接的轉化,固然谷歌大佬仍是作的最專業的,他家的是帶有分析,點擊統計的。緩存
谷歌大佬的簡單測試的地址:https://goo.gl/# 將連接放進去就能夠生成一個短連接了,下面還有分析。大佬就是叼。想要調用這個API的話,文檔在這裏:https://developers.google.com/url-shortener/v1/getting_started 作過谷歌API的,用這個比較方便,能夠省去研究谷歌API的受權的問題。若是沒作過還有下面的微信,微博,我想大多人應該都作過吧。服務器
微博的估計作的少,相信大多數人仍是微信用的多,appID,appSecret都用的比較六了。我用的也是微信的,就用微信作介紹,微博的話,調用其實也是受權的問題,只要有方便的受權,調用都很簡單。下面講微信的。微信
喏,這個是openwechat平臺的接口文檔,http://open.wechat.com/cgi-bin/newreadtemplate?t=overseas_open/docs/oa/promoting/url-shortener 哈,這個是英文滴,不要一打開就頭大哦,兩句話總結,就兩步,獲取accesstoken,拿着調用接口。就完事了。app
接口地址:HTTP request method: POST
https://api.wechat.com/cgi-bin/shorturl?access_token=ACCESS_TOKEN
curl
格式什麼的,我就不貼了,看那文檔吧。看不懂?我整理了個代碼,看這個(PHP):
<?php /** * Created by PhpStorm. * User: Yisen-YF * Date: 17/8/2 * Time: 上午11:23 * File: wechat_shorturl.php * */ header("Content-Type: text/html; charset=utf-8"); $longurl='http://www.cnblogs.com/yangf2016'; //if(isset($_POST['longurl'])){ // $longurl = $_POST['longurl']; //}else{ // die("沒有post值進來"); //} //echo $longurl; $id = "你的AppID";//appid $secret = "你的AppSecret";//secret $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$id."&secret=".$secret.""; $token = getAccessToken($url); //echo $token;die; //$token = 'Iuy4tZ4YXdIp03AGwfpC1FL2f6vYUQ83uirWXighPXLLO0D2o44aLFQP_laHm42JWW-TeE1BiSn5wNTRnAVPEm9BZgkjJXhfVx6xB5T4zr8Il2F2vUgTWSQS6JwaTGIPDHIjADAPTU'; //你的長連接 //$longurl = "http://www.baidu.com/"; $data = '{"action":"long2short","long_url":"'.$longurl.'"}'; $shorturl = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=".$token.""; echo httpPost($shorturl,$data); //echo "你的長連接是:".$longurl; //echo "<br />"; ////生成的短連接 //echo "生成的短連接是:".$shortArr['short_url']; //echo $shortArr; function getAccessToken($url) { // access_token 應該全局存儲與更新,如下代碼以寫入到文件中作示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { // echo 1;die; // 若是是企業號用如下URL獲取access_token $output = httpGet($url); $res = (array)json_decode($output); $access_token = $res['access_token']; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); //echo 'access_token.json讀寫了一次'; } } else { // echo 2;die; $access_token = $data->access_token; } return $access_token; } function httpGet($url) { //echo "url = ".$url; $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } function httpPost($url,$data){ $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $res = curl_exec($curl); curl_close($curl); return $res; } ?>
這個有兩個點,
1、AK的獲取和存儲是放到json文件中了,這個能夠按照本身項目中實際策略進行整理改造
2、post請求接口是本身寫了個方法,這個也能夠按照本身項目整理替換;
順便說一下微信受權常見的問題,受權token過時和本身服務器緩存的策略,還有全局使用統一token的策略。
具體的就不說了,作過的確定都知道,順帶找個博客給你們看,http://www.hutuseng.com/article/weixin-api-invalid-credential
Other:另外的接口地址實例:https://easywechat.org/zh-cn/docs/short-url.html
========================以上是應用級別,能夠解決任務,如下是具體的原理和衆多博客大佬們的實現================
1,10進制自增ID,轉16進制,轉62進制的方式:http://blog.csdn.net/beiyeqingteng/article/details/7706010
2,md5簡便算法:http://www.chongchonggou.com/g_44404501.html