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中this关键字使用方法详解
Mar 08 Javascript
用javascript做拖动布局的思路
May 31 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
Apr 01 Javascript
读jQuery之三(构建选择器)
Jun 11 Javascript
JavaScript面向对象设计二 构造函数模式
Dec 20 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
Nov 22 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
jQuery实现的背景颜色渐变动画效果示例
Mar 24 jQuery
element-ui组件中input等的change事件中传递自定义参数
May 22 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屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
use jscript List Installed Software
2007/06/11 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
python实现文字版扫雷
2020/04/24 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
见习期自我鉴定
2013/11/07 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
董事长开业致辞
2015/07/29 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫