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获取提交的字符串的字节数
Feb 09 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
为调试JavaScript添加输出窗口的代码
Feb 07 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 Javascript
jQuery webuploader分片上传大文件
Nov 07 Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 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
相对路径转化成绝对路径
2007/04/10 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python中asyncore的用法实例
2014/09/29 Python
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python中包的用法及安装
2020/02/11 Python
python二维图制作的实例代码
2020/12/03 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
特教教师先进事迹
2014/05/21 职场文书
商场促销活动策划方案
2014/08/18 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
毕业典礼致辞
2015/07/29 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
springboot+VUE实现登录注册
2021/05/27 Vue.js
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python