// 发送GET请求 const {logger} = require("./logger"); const http = require('http'); const https = require('https'); const fs = require("fs"); //公共的请求头 function getHeaders(headers, body) { if (body.length !== 0) { headers['Content-Length'] = Buffer.byteLength(body) } headers['Content-Type'] = 'application/json' return headers } function request_get(url, headers) { return new Promise((resolve, reject) => { var callback = function (res) { let data = ''; // 监听数据事件来收集响应数据 res.on('data', (chunk) => { data += chunk; }); // 监听结束事件来处理响应结束 res.on('end', () => { // logger.info(`响应体: ${data}`); resolve(data); }); } var errorback = function errorback(e) { // logger.error(`请求遇到问题: ${e.message}`); reject(e); } // POST 请求的选项 const options = { method: 'GET', headers: getHeaders(headers, "") }; let httpsReq = null if (!url.includes("https")) { httpsReq = http.request(url, options, callback).on('error', errorback); } else { httpsReq = https.request(url, options, callback).on('error', errorback); } // 不要忘了关闭请求,以防止内存泄漏 httpsReq.end(); }); } function request_post(url, param, headers) { return new Promise((resolve, reject) => { var callback = function (res) { let data = ''; // 监听数据事件来收集响应数据 res.on('data', (chunk) => { data += chunk; }); // 监听结束事件来处理响应结束 res.on('end', () => { // logger.info(`响应体: ${data}`); resolve(data); }); } var errorback = function errorback(e) { // logger.error(`请求遇到问题: ${e.message}`); reject(e); } // POST 请求的数据 const postData = JSON.stringify(param); // logger.info('请求参数:', postData, headers); // POST 请求的选项 // logger.info('请求头:', headers); const options = { method: 'POST', headers: getHeaders(headers, postData) }; var postReq = null; if (!url.includes("https")) { postReq = http.request(url, options, callback).on('error', errorback); } else { postReq = https.request(url, options, callback).on('error', errorback); } // 写入数据到请求体 postReq.write(postData); // 结束请求 postReq.end(); }) } function dowFile(url, fileName, dowPath, headers) { return new Promise((resolve, reject) => { // 设定您想要下载的宝藏(文件)的位置 const fileUrl = url + "/" + fileName; // 指定要将下载的宝藏存放在何处(本地路径) const filePath = dowPath + "/" + fileName; // 创建一个能写入宝藏的空箱子(写入流) const fileStream = fs.createWriteStream(filePath); headers = getHeaders(headers, "") logger.info('headers:!', headers, fileUrl); headers["User-Agent"] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' const options = { headers: headers }; http.get(fileUrl, options, (response) => { // 将收到的宝藏(响应流)流入箱子(文件流)中 response.pipe(fileStream); // 等待宝藏完全转移完毕 fileStream.on('finish', () => { // 现在宝藏已经安全地放在箱子里(文件写入完成) fileStream.close(); logger.info('文件下载完成,船长!'); resolve(true) }); }).on('error', (err) => { // 如果在转移宝藏过程中遇到海怪(错误)... logger.error('在下载文件时遇到了问题:', err); // 别忘了关闭箱子(文件流) fileStream.close(); // 如果宝藏已经损坏(文件已经部分写入),丢弃它(删除文件) if (fileStream.bytesWritten === 0) { fs.unlink(filePath, (unlinkErr) => { if (unlinkErr) logger.error('无法删除不完整的文件:', unlinkErr); }); } reject(err) }); }); } module.exports = { request_get, request_post, dowFile };