Node.js中的http请求客户端示例(request client)


Posted in Javascript onMay 04, 2017

Node.JS有一个request模块,可以很方便的抓取网页内容。最简单的一个示例:

var request = require('request');

request('http://www.google.com', function (error, response, body) {
 if (!error && response.statusCode == 200) {
  console.log(body);
 }
})

由上例可以看出用request发起一个http请求确实非常简单,不过唯一的问题就是,request模块的第三方依赖比较多,导致这个模块非常地大,要占用好几M的空间。

其实用node.js原生的http模块就可以很方便地写出一个类似的request的功能,只要几十行即可:

var http = require('http')
var url  = require('url')


var request = function(reqUrl, data, cb, headers) {
 var dataType = typeof data

 if (dataType == 'function') {
  headers = cb
  cb   = data
  rawData = null
 } else if (dataType == 'object') {
  rawData = JSON.stringify(data)
 } else {
  rawData = data
 }

 var urlObj = url.parse(reqUrl)

 var options = {
   hostname : urlObj.hostname
  , port   : urlObj.port
  , path   : urlObj.pathname
  , method  : rawData ? 'post' : 'get'
 }

 headers && (options.headers = headers)


 var req = http.request(options, function(res) {
  var receives = []

  if (res.statusCode !== 200) {
   cb && cb(new Error('Request Failed. Status Code: ' + res.statusCode + ' ' + reqUrl))
   return
  }

  res.on('data', function(chunk) {
   receives.push(chunk)
  })

  res.on('end', function() {
   var resData = Buffer.concat(receives).toString()
   try {
    resData = JSON.parse(resData)
   } catch (e) { }

   cb && cb(null, res, resData)
  })
 })

 req.on('error', function(e) {
  cb && cb(e)
 })

 rawData && req.write(rawData)

 req.end()
}


module.exports = request

使用接口与request模块是一样的,比如我们抓取新浪新闻首页的内容

request('http://news.sina.com.cn', function(err, res, data) {
 console.log('geted', data)
})

其次它还支持抓取时附加cookie等header认证信息,如

request('http://news.sina.com.cn', function(err, res, data) {
 console.log('get with cookie', data)
}, { cookie: '_sessionid=1234567890' })

对POST的支持

request('http://news.sina.com.cn', { postdata: 'json' }, function(err, res, data) {
 console.log('get with cookie', data)
}, { cookie: '_sessionid=1234567890' })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
javascript onmouseout 解决办法
Jul 17 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
Dec 03 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
Angularjs实现搜索关键字高亮显示效果
Jan 17 Javascript
canvas实现刮刮卡效果
Mar 14 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
对于js垃圾回收机制的理解
Sep 14 Javascript
微信小程序实现的日期午别医生排班表功能示例
Jan 09 Javascript
微信小程序 select 下拉框组件功能
Sep 09 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 #Javascript
vue.js开发环境搭建教程
May 04 #Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 #jQuery
详解webpack es6 to es5支持配置
May 04 #Javascript
angular 基于ng-messages的表单验证实例
May 04 #Javascript
JS实现标签页切换效果
May 04 #Javascript
ES6下React组件的写法示例代码
May 04 #Javascript
You might like
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
Python验证文件是否可读写代码分享
2017/12/11 Python
python检测IP地址变化并触发事件
2018/12/26 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
python实现从ftp服务器下载文件
2020/03/03 Python
关于python 跨域处理方式详解
2020/03/28 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
NET程序员上机面试题
2015/05/23 面试题
服务员岗位责任制
2014/02/11 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
工业设计专业自荐书
2014/06/05 职场文书
安全生产月标语
2014/10/07 职场文书
2014年副班长工作总结
2014/12/10 职场文书
云台山导游词
2015/02/03 职场文书
关于公司年会的开幕词
2016/03/04 职场文书