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解密入门之凭直觉解
Jun 25 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
Feb 24 Javascript
iframe子父页面调用js函数示例
Nov 07 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
Feb 02 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 Javascript
vue2.0 循环遍历加载不同图片的方法
Mar 06 Javascript
对vux点击事件的优化详解
Aug 28 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
收集的DedeCMS一些使用经验
2007/03/17 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
vue slots 组件的组合/分发实例
2018/09/06 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
python对字典进行排序实例
2014/09/25 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
python反扒机制的5种解决方法
2021/02/06 Python
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
经典洗发水广告词
2014/03/13 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
办公室规章制度范本
2015/08/04 职场文书