短链接学习
来源:互联网 发布: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区别
- 短链接学习
- 短链接
- 短链接
- 长链接/短链接
- 长链接转短链接
- 长链接转短链接
- TCP长链接/短链接
- 长链接和短链接
- 长链接转短链接
- 强大的短链接
- Java生成短链接
- 短链接原理
- 短链接 Java
- 生成短链接
- 短链接生成算法
- 生成短链接
- 苹果“短” 链接服务
- 短链接 生成代码
- 如何让浏览器访问最新的js、css等外部引用文件?
- 判断一个BigDecimal数值是否为零
- 【HDU-oj】-1575-Tr A(矩阵)
- Reverse Interget
- redis 集群搭建 遇到的问题 Sorry, can't connect to node 127.0.0.1:7000
- 短链接学习
- Jmeter(一)jmeter介绍和安装
- 程序中的const对象以及extern关键词的使用
- c语言---输入一个字符串,删除其中的某一个字符
- 兜转数年,老跳成了卖过软件开过店写过APP的电脑老师
- 16 flume安装、部署及案例
- windows 控制台cmd乱码的解决办法
- VC 用发音函数Beep()播放简谱音乐
- 优先队列