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实用示例 缩址还原
Dec 28 NodeJs
nodejs教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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
改进的IP计数器
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php 定界符格式引起的错误
2011/05/24 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
初识JQuery 实例一(first)
2011/03/16 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
pygame加载中文名mp3文件出现error
2017/03/31 Python
利用python求积分的实例
2019/07/03 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
用Python写一个for循环的例子
2016/07/19 面试题
行政办公员自我评价分享
2013/12/14 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
国王的演讲观后感
2015/06/03 职场文书