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 URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
用PHP调用数据库的存贮过程!
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery实现菜单栏导航效果
2017/08/15 jQuery
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
初学Python实用技巧两则
2014/08/29 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
反腐倡廉观后感
2015/06/08 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android