node:封装http请求

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值