1、封装的node中的http/https请求库及代理的实现
/**
* @ Author: FSX
* @ Create Time: 2024-09-20 18:02:41
* @ Modified by: FSX
* @ Modified time: 2024-09-25 15:27:38
* @ Description: 创客贴接口返回格式和saas要求格式不一致导致,返回的参数无法接受到,故重新写了这一套接口请求逻辑来处理类似三方接口的返回结果
*/
import { logger } from '@fe/framework';
const http = require('http'); // 对于HTTP请求
// const http = require('https'); // 对于HTTPS请求
const qs = require('qs');
const querystring = require('querystring');
const HttpProxyAgent = require('http-proxy-agent');
// const HttpsProxyAgent = require('https-proxy-agent');
const log = logger.get('services/http-custom:');
// 代理服务器的URL
const proxy = 'http://10.237.101.122:81';
// 创建代理IP
const agent =
window.RPCONFIG.RUNTIME_ENV === 'test' ? new HttpProxyAgent(proxy) : null;
// const agent = new HttpsProxyAgent(proxy);
console.log('~~agent~~', agent);
const Get = (
url: string,
params: Record<string, any>,
callback: (err?: any, res?: any) => void
) => {
// 解析URL以提取主机名和端口号
const parsedUrl = new URL(url);
const options = {
hostname: parsedUrl.hostname,
// port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
// path: parsedUrl.pathname + parsedUrl.search,
port: 80,
path: `${parsedUrl.pathname}?${qs.stringify(params)}`,
method: 'GET',
agent,
};
log.info('~~options~~', options);
// 发起请求
const req = http.request(options, (res: any) => {
let data = '';
// 接收数据片段
res.on('data', (chunk: any) => {
data += chunk;
});
// 请求结束,处理数据
res.on('end', () => {
log.info('~~end~~', res);
callback(null, {
statusCode: res.statusCode,
headers: res.headers,
body: data,
});
});
});
// 错误处理
req.on('error', (e: any) => {
log.info('~~error~~', e);
callback(e);
});
// 结束请求
req.end();
};
const Post = (
url: string,
params: Record<string, any>,
callback: (err?: any, res?: any) => void
) => {
// 解析URL以提取主机名和端口号
const parsedUrl = new URL(url);
const postData = querystring.stringify(params);
console.log('~~~post~~~', postData);
const options = {
hostname: parsedUrl.hostname,
// port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
// path: parsedUrl.pathname + parsedUrl.search,
port: 80,
path: parsedUrl.pathname,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': postData.length,
},
agent,
};
// 发起请求
const req = http.request(options, (res: any) => {
let data = '';
// 接收数据片段
res.on('data', (chunk: any) => {
data += chunk;
});
// 请求结束,处理数据
res.on('end', () => {
callback(null, {
statusCode: res.statusCode,
headers: res.headers,
body: data,
});
});
});
// 错误处理
req.on('error', (e: any) => {
callback(e);
});
req.write(postData);
// 结束请求
req.end();
};
const httpGet = (url: any, data: any) => {
return new Promise((resolve, reject) => {
Get(url, data, (err: any, response: any) => {
if (err) {
console.error('err', err);
reject(err);
} else {
console.log('success', response.body);
resolve(JSON.parse(response.body).body);
}
});
});
};
const httpPost = (url: any, data: any) => {
return new Promise((resolve, reject) => {
Post(url, data, (err: any, response: any) => {
if (err) {
console.error('err', err);
reject(err);
} else {
console.log('success', response.body);
resolve(JSON.parse(response.body).body);
}
});
});
};
module.exports = {
get: httpGet,
post: httpPost,
};
2、调用示例:
const HttpCustom = require('../utils/http-custom');
async function updateTitle(data: Record<string, any>) {
const url = `${apiCktHost}/updateTitle.do`;
const res = await HttpCustom.post(url, data);
return res;
}