nodejs实用示例 缩址还原


Posted in NodeJs onDecember 28, 2010

思路非常简单:
1. httpserver获取需要还原的url;
2. 使用httpclient递归请求这个url,直到发现http status not in (302, 301)为止。
3. 返回还原的原url。

好吧,代码如下:

var net = require('net'), 
http = require('http'), 
url = require('url'), 
fs = require('fs'); 
var DEFAULT_PORTS = { 
'http:': 80, 
'https:': 443 
}; 
var INDEX_TPL = fs.readFileSync('index.html'); 
function _write(str, res, content_type) { 
if(res.jsonp_cb) { 
str = res.jsonp_cb + '("' + str + '")'; 
} 
res.writeHead(200, { 
'Content-Length': str.length, 
'Content-Type': content_type || 'text/plain' 
}); 
res.end(str); 
}; 
function expand(short_url, res) { 
var info = url.parse(short_url); 
// console.log('info: ' + JSON.stringify(info)); 
if(info.protocol != 'http:') { // 无法请求https的url? 
_write(short_url, res); 
return; 
} 
var client = http.createClient(info.port || DEFAULT_PORTS[info.protocol], info.hostname); 
var path = info.pathname || '/'; 
if(info.search) { 
path += info.search; 
} 
var headers = { 
host: info.hostname, 
'User-Agent': 'NodejsSpider/1.0' 
}; 
var request = client.request('GET', path, headers); 
request.end(); 
request.on('response', function (response) { 
if(response.statusCode == 302 || response.statusCode == 301) { 
expand(response.headers.location, res); 
} else { 
_write(short_url, res); 
} 
}); 
}; 
//expand('http://sinaurl.cn/hbMUII'); 
// http服务 
http.createServer(function(req, res){ 
if(req.url.indexOf('/api?') == 0) { 
var params = url.parse(req.url, true); 
if(params.query && params.query.u) { 
if(params.query.cb) { // 支持jsonp跨域请求 
res.jsonp_cb = params.query.cb; 
} 
expand(params.query.u, res); 
} else { 
_write('', res); 
} 
} else { 
_write(INDEX_TPL, res, 'text/html'); 
} 
}).listen(1235); 
process.on('uncaughtException', function (err) { 
console.log('Caught exception: ' + err); 
});

启动你的web服务器吧:
$ node urlexpand.js
打开浏览器直接访问:
http://127.0.0.1:1235/api?u=http://is.gd/imWyT
或者访问我的测试服务器:
http://yongwo.de:1235/api?u=http://is.gd/imWyT&cb=foo
NodeJs 相关文章推荐
nodejs实用示例 缩址还原
Dec 28 NodeJs
初始Nodejs
Nov 08 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 #NodeJs
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 #NodeJs
nodejs 后缀名判断限制代码
Mar 31 #NodeJs
NodeJS框架Express的模板视图机制分析
Jul 19 #NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
You might like
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
python线程join方法原理解析
2020/02/11 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
视光学专业毕业生推荐信
2013/10/28 职场文书
法律七进实施方案
2014/03/15 职场文书
医院节能减排方案
2014/06/13 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
计划生育工作汇报
2014/10/28 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers