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 相关文章推荐
基于jquery的tab切换 js原理
Apr 01 Javascript
提高javascript效率 一次判断,而不要次次判断
Mar 30 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
Jan 29 Javascript
微信小程序之MaterialDesign--input组件详解
Feb 15 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
vue引入axios同源跨域问题
Sep 27 Javascript
Node.js系列之连接DB的方法(3)
Aug 30 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
jquery插件实现图片悬浮
Apr 16 jQuery
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验证码(支持中文)
2007/02/14 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
对python中return与yield的区别详解
2020/03/12 Python
华为慧通面试题
2012/09/11 面试题
班组长岗位职责范本
2014/01/05 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
Python requests用法和django后台处理详解
2022/03/19 Python