nodejs实现的http、https 请求封装操作示例


Posted in NodeJs onFebruary 06, 2020

本文实例讲述了nodejs实现的http、https 请求封装操作。分享给大家供大家参考,具体如下:

libs/request.js

const URL = require('url');
const zlib = require('zlib');
const http = require('http');
const https = require('https');
const qs = require('querystring');
function Request(cookie) {
 this.cookies = [];
 if (cookie !== undefined) {
 this.setCookie(cookie);
 }
}
Request.prototype.getHeaders = function(host, postData) {
 let headers = {
 'Host': host,
 'Pragma': 'no-cache',
 'Connection': 'keep-alive',
 'Cache-Control': 'no-cache',
 'Content-Type': 'application/x-www-form-urlencoded',
 'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,es;q=0.2',
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
 };
 if (this.cookies.length) {
 headers.Cookie = this.cookies.join('; ');
 }
 if (postData != '') {
 headers['Content-Length'] = Buffer.byteLength(postData);
 }
 return headers;
}
Request.prototype.setCookie = function(cookie) {
 let cookies = cookie.split(';');
 for (let c of cookies) {
 c = c.replace(/^\s/, '');
 this.cookies.push(c);
 }
 return this;
}
Request.prototype.request = function(method, url, params) {
 let postData = qs.stringify(params || {});
 let urlObj = URL.parse(url);
 let protocol = urlObj.protocol;
 let options = {
 hostname: urlObj.host,
 port: urlObj.port,
 path: urlObj.path,
 method: method,
 headers: this.getHeaders(urlObj.host, postData),
 };
 return new Promise((resolve, reject) => {
 let req = (protocol == 'http:' ? http : https).request(options, (res) => {
  let chunks = [];
  res.on('data', (data) => {
  chunks.push(data);
  });
  res.on('end', () => {
  let buffer = Buffer.concat(chunks);
  let encoding = res.headers['content-encoding'];
  if (encoding == 'gzip') {
   zlib.gunzip(buffer, function(err, decoded) {
   resolve(decoded.toString());
   });
  } else if (encoding == 'deflate') {
   zlib.inflate(buffer, function(err, decoded) {
   resolve(decoded.toString());
   });
  } else {
   resolve(buffer.toString());
  }
  });
 });
 req.on('error', (e) => {
  reject(e);
 });
 if (postData != '') {
  req.write(postData);
 }
 req.end();
 })
}
Request.prototype.get = function(url) {
 return this.request('GET', url, null);
}
Request.prototype.post = function(url, params) {
 return this.request('POST', url, params);
}
module.exports = function(cookie) {
 return new Request(cookie);
}

test.js

const request = require('./request')();
(async function() {
 let res = await request.get('http://www.axita.com.cn/');
 console.log(res);
})();

执行命令

nodemon test.js

希望本文所述对大家node.js程序设计有所帮助。

NodeJs 相关文章推荐
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
Nodejs Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
nodejs基础应用
Feb 03 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 #NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 #NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 #NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 #NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 #NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 #NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 #NodeJs
You might like
教你识别简单的免查杀PHP后门
2015/09/13 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
python怎么删除缓存文件
2020/07/19 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
犯错检讨书
2014/02/21 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
二年级评语大全
2014/04/23 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
Python实现拼音转换
2021/06/07 Python