Golang开发指南Go知识库

Go短链接服务分析

2016-06-09  本文已影响406人  yaoshiyou

概览

应用场景

  1. 微信文章分享,访问1次后失效
  2. 文章分享,需要密码访问
  3. 以二维码访问分享链接
  4. 访问城市,设备统计
  5. 分享后能保留#后长尾路由

功能列表

  1. 允许给短网址加密码,分享更私密
  2. 短网址只想被人访问1次?2次?若干次?都可以,只要你指定就行
  3. 接入到你的应用系统中?开放API
  4. 二维码展示
  5. 访客统计的来自哪个城市?用什么上网?操作系统是什么?IP是什么?用的什么浏览器等等。

对象列表

gox_url_item

名称 描述
ID guid
TYPE 301跳转,302跳转,302直达,js跳转,meta跳转
SHORT_CODE 编号
URL_LONG 长网址
URL_CALLBACK 回调地址
COUNT_ALLOW 允许次数
COUNT_VISiT 访问次数

API列表

短网址生成

Get url

http://dev.xxx.com/create?applicationId=123?url_long=[长网址]&url_callback=[http://dev.xxx.com/owx/{shortCode}]&time=1&expires=1141889120&password=000000

  1. applicationId参数为应用id,可为空
  2. times参数是可分享次数
  3. auth=1 参数为启用密码访问
  4. applicationId 为应用id可为空
  5. url_callback 为跳转回调地址,需要在回调地址中通过api 获取回调具体地址
  6. url_long 访问地址
  7. expires这个参数的值是一个UNIX时间(自UTC时间1970年1月1号开始的秒数,详见wiki),用于标识该URL的超时时间。如果OSS接收到这个URL请求的时候晚于签名中包含的Expires参数时,则返回请求超时的错误码。例如:当前时间是1141889060,开发者希望创建一个60秒后自动失效的URL,则可以设置Expires时间为1141889120。
  8. restype 返回类型 json 返回对象,qrcode 返回直接返回二维码
  9. logo qrocde中间的logo nbeport 返回电子口岸 logo , nbciq 返回宁波国检logo

示例1 生成短链接
http://localhost/go/create?applicationId=123&url_long=http://www.baidu.com&url_callback=http://www.baidu.com/{shortCode}&time=1&expires=1141889120&password=000000

示例2 生成短链接二维码
http://eas.nbeport.com/go/create?applicationId=0d4f799b-7a76-4292-a485-768ad69e61f5&url_long=9d6b973a-0187-4858-83e9-ff2b6d37b2f6&restype=qrcode

返回结果

{"ShortCode":"7J7fIn","ShortUrl":"http://dev.www.com/go/7J7fIn"}

示例
http://localhost/go/create?applicationId=123&url_long=http%3A%2F%2Fdev.xx.com%2Fowx%2F%23%2Ftab%2Fsend&url_callback=http%3A%2F%2Fdev.xx.com%2Fowx%2Fhome%2F{0}&auth=1

短网址获取信息

请求参数

get url:http://dev.xxx.com/go/get/{shortCode}

返回结果

{"ShortCode":"7J7fIn","CallBackUrl":"http://dev.xxx.com/owx/{0}","LongUrl":"http://dev.xxx.com/nqp/#/tab/send","Expires":1234312111,"Times":-1,"Password":"","VistCount":0}

短网址直接访问

浏览器中直接访问 http://dev.xxx.com/go/{shortCode}

短网址二维码显示

http://dev.xxx.com/go/{shortCode}/qrcode/{pix}

应用示例

301跳转

  1. 使用 短网址生成 生成短网址
  2. 分享短网址
  3. 短网址将重定向到目标网址

callback调用

  1. 使用 短网址生成 生成短网址
  2. 分享短网址
  3. 短网址将重定向到回调地址
  4. 回调地址通过[短网址获取信息]接口获取配置信息
  5. 业务逻辑后续处理

Key生成算法

  1. 将长网址md5生成32位签名串,分为4段, 每段8个字节;
  2. 对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
  3. 这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
  4. 总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;

`public class UrlHelper {
public static string[] Create(string url)
{
//可以自定义生成MD5加密字符传前的混合KEY
string key = "mykey1";
//要使用生成URL的字符
string[] chars = new string[]{
"a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,
"i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" ,
"q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" ,
"y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" ,
"6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" ,
"E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" ,
"M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,

            "U" , "V" , "W" , "X" , "Y" , "Z"};
        //对传入网址进行MD5加密
        string hex = Md5Hash(key + url);
        string[] resUrl = new string[4];
        for (int i = 0; i < 4; i++)
        {
            //把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
            int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16);
            string outChars = string.Empty;
            for (int j = 0; j < 6; j++)
            {
                //把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
                int index = 0x0000003D & hexint;
                //把取得的字符相加
                outChars += chars[index];
                //每次循环按位右移5位
                hexint = hexint >> 5;
            }
            //把字符串存入对应索引的输出数组
            resUrl[i] = outChars;
        }
        return resUrl;
    }
    /// <summary>
    /// 32位MD5加密
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    private static string Md5Hash(string input)
    {
        MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
        byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
        StringBuilder sBuilder = new StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }
        return sBuilder.ToString();
    }
}`
上一篇下一篇

猜你喜欢

热点阅读