短链接学习

来源:互联网 发布:mac安装windows虚拟机 编辑:程序博客网 时间:2024/05/21 17:13

最近接到一个任务说SDWebImage短链接图片无法下载,当时很疑惑,这么流行的图片下载工具怎么会不支持短链接呢.于是做了一番调研,最后结果发现是乌龙,运营把网页的短链接当成图片的短链接使用了.也趁这个机会学习了下短链接.

一、短链简单介绍

1.是什么:通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。这里的短链接和http和短连接是两个概念.
2.优势:
方便统计数据和监控,至于怎么用,要看业务需要,比如统计热门分享
字数更少.比起冗长的链接url,短链接更容易分享和传播
3.网上的短链接生成教程
http://jingyan.baidu.com/article/0a52e3f41bd10fbf62ed7237.html

二、短链接原理

当我们在浏览器里输入短链接后,DNS会首先解析到短链接的IP地址,然后向该地址发送get请求,服务器会查询到该短链接的对应的长url,然后把请求通过http 301(永久重定向)或302(临时重定向)跳转到长url,后面的流程就与普通的url没有区别了.

地址转换原理
通过上面的原理可以知道短链接和长链接是有映射关系的,那怎样把长链接映射成短链接呢.网上有MD5映射,进制转换等.我从网上抄了一段进制转换算法,采用swift实现.
短地址使用[a - z, A - Z, 0 - 9] 组合,如果是6位的话,总共会有 62^6 ~= 568亿种组合,基本够用了.
数据库存储三个字段: id(自增) shorturl longurl

下面通过id计算出shorturl
62个字母可以使用62进制,为防止一开始就出现太多的0,我们从a开始计数
0->a,1->b,2->c,...52->0,..61->9

将id转换成62进制数,小端顺序

func convertToBase62(num:NSInteger)->Array<NSInteger>{    var arr = Array<NSInteger>()    var tmp:NSInteger = num    while tmp > 0 {        let remainder = tmp % 62        arr.append(remainder)        tmp = tmp/62    }    return arr}

假设长连接url:http://lianghui.huanqiu.com/2017/roll/2017-03/10247690.html?from=bdwz 对应的id是130,转成62进制则是[‘2’,’6’],对应的字母为cf,假设我们有域名short,则短链接为http://short/cf

解析短链接
首先获取到短链接对应的字符串如cf,cf通过映射解析为[‘2’,’6’],通过以下函数获取到十进制的id

func resolveBase62(arr:Array<NSInteger>)->NSInteger {    if arr.count == 0{        return 0    }    var num = 0    var index = 0    for item in arr {                let res = pow(62.0, Float(index))        num = item * Int(res) + num        index += 1    }    return num}

三、object-c中重定向

1.SDWebImage我自己测试3.7.2到4.0.0都是默认支持短连接(301,302)跳转的.4.0.0添加实现了重定向方法实现.
2.nsurlsession相关协议方法:

  • (void)URLSession:(NSURLSession *)session
 task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
 newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest *))completionHandler
    1
    对于默认的session和暂时的session管理的url请求任务发生重定向时就会调用这个方法,而后台任务发生重定向会直接服从重定向。

在这个方法里面,可以获取到新的url请求,调用completionHandler(request);就会允许重定向。如果调用completionHandler(nil);就相当于拒绝重定向。当然也可以调用completionHandler(otherRequest);实现自定义重定向。

参考链接

1.StackOverflow
2.http301,302区别

0 0
原创粉丝点击