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 相关文章推荐
关于Javascript 的 prototype问题。
Jan 03 Javascript
JQuery魔力之$("tagName")与selector
Mar 05 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
Jan 23 Javascript
AngularJS实现Model缓存的方式
Feb 03 Javascript
jQuery 3.0十大新特性
Jul 06 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
详解nvm管理多版本node踩坑
Jul 26 Javascript
JavaScript变量Dom对象的所有属性
Apr 30 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 Javascript
利用js canvas实现五子棋游戏
Oct 11 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创建基本身份认证站点的方法详解
2013/06/08 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
Python 3.x 新特性及10大变化
2015/06/12 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
浅谈flask源码之请求过程
2018/07/26 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
简单了解python数组的基本操作
2019/11/26 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
省优秀教师事迹材料
2014/01/30 职场文书
校园安全广播稿
2014/02/08 职场文书
事务机电主管工作职责
2014/02/25 职场文书
主管会计岗位职责
2014/03/13 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL