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 URL传中文参数引发的乱码问题
Sep 02 Javascript
jquery+json 通用三级联动下拉列表
Apr 19 Javascript
javascript forEach通用循环遍历方法
Oct 11 Javascript
基于jquery的仿百度搜索框效果代码
Apr 11 Javascript
iframe中使用jquery进行查找的方法【案例分析】
Jun 17 Javascript
Bootstrap前端开发案例一
Jun 17 Javascript
vue高德地图之玩转周边
Jun 16 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
js序列化和反序列化的使用讲解
Jan 19 Javascript
Vue实现日历小插件
Jun 26 Javascript
ES6 十大特性简介
Dec 09 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中变量及部分适用方法
2008/03/27 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
CI框架Session.php源码分析
2014/11/03 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
Javascript实现字数统计
2015/07/03 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
Angular父组件调用子组件的方法
2018/04/02 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python Queue模块详解
2014/11/30 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
实现Python与STM32通信方式
2019/12/18 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
参观考察邀请函范文
2014/01/29 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
高中综合实践活动总结
2014/07/07 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
大学入学感言
2015/08/01 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
Python实现归一化算法详情
2022/03/18 Python