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极简入门教程(三):进程
Oct 27 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
配置nodejs环境的方法
May 13 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
jquery tools之tooltip
2009/07/25 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
vue的mixins属性详解
2018/03/14 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Django框架封装外部函数示例
2019/05/28 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Pycharm修改python路径过程图解
2020/05/22 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
中学老师的自我评价
2013/11/07 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
十一酒店活动方案
2014/02/20 职场文书
2014年施工员工作总结
2014/11/18 职场文书
开场白怎么写
2015/06/01 职场文书
舞出我人生观后感
2015/06/16 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL