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 相关文章推荐
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 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
phpwind中的数据库操作类
2007/01/02 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Python实现k-means算法
2018/02/23 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
银行出纳岗位职责
2013/11/25 职场文书
护士自我评价范文
2014/01/25 职场文书
决心书标准格式
2014/03/11 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
大型演出策划方案
2014/05/28 职场文书
小学校本培训方案
2014/06/06 职场文书
2014年小学工作总结
2014/11/26 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
Python find()、rfind()方法及作用
2022/12/24 Python