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 相关文章推荐
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
收集的一些Array及String原型对象的扩展实现代码
Dec 05 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
Oct 21 Javascript
浅析Node.js:DNS模块的使用
Nov 23 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
Aug 13 Javascript
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 Javascript
Openlayers实现测量功能
Sep 25 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计划任务、定时执行任务的实现代码
2011/04/23 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
解析php5配置使用pdo
2013/07/03 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
Python分治法定义与应用实例详解
2017/07/28 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python Tornado框架的使用示例
2020/10/19 Python
Python调用Redis的示例代码
2020/11/24 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
如何利用cmp命令比较文件
2016/04/11 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
珍惜资源的建议书
2014/08/26 职场文书
导游词之山东八大关
2019/12/18 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记