Go短链接服务分析

作者: yaoshiyou | 来源:发表于2016-06-09 17:02 被阅读406次

    概览

    应用场景

    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();
        }
    }`

    相关文章

      网友评论

        本文标题:Go短链接服务分析

        本文链接:https://www.haomeiwen.com/subject/znajdttx.html