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
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
四种会话跟踪技术
2015/05/20 面试题
医学生实习自荐信
2013/10/01 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
党支部四风整改方案
2014/10/25 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS