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框架Express的模板视图机制分析
Jul 19 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
php正则
2006/07/07 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
php实现微信支付之现金红包
2018/05/30 PHP
深入分析PHP设计模式
2020/06/15 PHP
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
Python脚本实现代码行数统计代码分享
2015/03/10 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
一些Unix笔试题和面试题
2012/09/25 面试题
政治表现评语
2014/05/04 职场文书
农村门前三包责任书
2014/07/25 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
Pytest allure 命令行参数的使用
2021/04/18 Python