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 打印页面代码
Mar 24 Javascript
jquery ajax提交表单数据的两种方式
Nov 24 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
利用jQuery实现可以编辑的表格
May 26 Javascript
arguments对象验证函数的参数是否合法
Jun 26 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
JS简单实现动态添加HTML标记的方法示例
Apr 08 Javascript
小程序组件之自定义顶部导航实例
Jun 12 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
Jul 11 Javascript
js利用递归与promise 按顺序请求数据的方法
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
Smarty安装配置方法
2008/04/10 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
深入理解js promise chain
2016/05/05 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
python中的函数用法入门教程
2014/09/02 Python
python实现的简单文本类游戏实例
2015/04/28 Python
python生成九宫格图片
2018/11/19 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
专业销售业务员求职信
2013/11/18 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
OpenCV-Python实现油画效果的实例
2021/06/08 Python
python not运算符的实例用法
2021/06/30 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android