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支持带x身份证号码验证函数
Aug 10 Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 Javascript
js 判断控件获得焦点的示例代码
Mar 04 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
AngularJs中route的使用方法和配置
Feb 04 Javascript
jQuery判断checkbox选中状态
May 12 Javascript
详解vue 模版组件的三种用法
Jul 21 Javascript
详解用node搭建简单的静态资源管理器
Aug 09 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
使用js在layui中实现上传图片压缩
Jun 18 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采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
JTrackBar水平拖动效果
2007/07/15 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Python中Selenium库使用教程详解
2020/07/23 Python
python 怎样进行内存管理
2020/11/10 Python
python openpyxl模块的使用详解
2021/02/25 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
中职生自荐信
2013/10/13 职场文书
关于赌博的检讨书
2014/01/08 职场文书
和谐社区口号
2014/06/19 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
财务会计实训报告
2014/11/05 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python