存储转发服务

此服务用于以下场景,有模拟服务的需求,可以通过转发服务,记录请求和返回参数,存入本地,下次同样请求,不再请求真是服务。可以用在soap服务,webapi服务。

Router:

import { RouterAbs } from './commons/router.abs';  

import { SystemApiController } from '../controllers/system/systemApi.controller';

import path from 'path';

export class SystemRouter extends RouterAbs {

  config() {

    let controllerName = '/*';

    let _SystemApiController = new SystemApiController();

    this.server.post(controllerName + '/*', _SystemApiController.Proxy.bind(_SystemApiController));

    this.server.get(controllerName + '/*', _SystemApiController.Proxy.bind(_SystemApiController));

    this.server.put(controllerName + '/*', _SystemApiController.Proxy.bind(_SystemApiController));

    this.server.patch(controllerName + '/*', _SystemApiController.Proxy.bind(_SystemApiController));

  }

}

Controller:

import { Request, Response, Next } from 'restify';

import { SystemApiAction } from '../../actions/system/systemApi.action';

import { ControllerAbs } from '../commons/controller.abs';


 

export class SystemApiController extends ControllerAbs {

  public Proxy(req: Request, res: Response, next: Next) {

      let action = new   SystemApiAction();

      action .Proxy(req, res, next);

  }

}

Action:

import { Request, Response, Next } from 'restify';

import { AppUtils } from '../../utils/app.utils';

import { LogHelper } from '../../utils/log.helper';

import { v1 } from 'uuid';

import { Op, Transaction,Sequelize } from 'sequelize';

import { promises } from 'dns';

import { serialize } from 'v8';

import { HttpUtil } from '../../common/http.util';

import { resolve } from 'bluebird';

import request from 'request'

import { Json } from 'sequelize/types/lib/utils';

import { ApiConfig } from '../../api.config';

import X2JS = require("x2js");

export class SystemApiAction  {

  constructor() {

  }


 

  public Proxy(req: Request, res: Response, next: Next) {



 

    let remoteAddress = req.connection.remoteAddress + '';

    let extFile = 'json';

   

    let input = req.body;

    LogHelper.Info(remoteAddress, 'Proxy 开始');

    LogHelper.Info(remoteAddress, 'Proxy 输入参数' + JSON.stringify(input));

    if (req.url && req.method)

    {

       let apiUrl = req.url;

       if (req.headers.soapaction)

       {

          apiUrl = req.headers.soapaction.toString();

       }

       

       let contentType ='json';

       if ( req.headers && req.headers['content-type'] && req.headers['content-type'] .includes('text/xml'))

       {

          contentType = 'xml';    

          extFile = 'xml';  

       }

       let _md5 = AppUtils.CalcMD5( req.method +'|' + apiUrl);

       


 

       AppUtils.WriteLog(apiUrl);

       let fackDataCheckResult = AppUtils. FackDataExist(_md5,extFile);

   

         if (fackDataCheckResult.fileExist)

       {

          let fackData =  AppUtils.GetFackData(fackDataCheckResult.fileName);


 

         

          if (contentType == 'xml')

          {  

            res.sendRaw(   fackData );

          }

         else

          {

            res.send( JSON.parse( fackData));

          }

       }

       else  

     

       {

          let _url =  ApiConfig.targetService + req.url;

          let _method :string = req.method;

     

   

           


 

          request(_url,

           

              { body: req.body ,

                method:_method,  

                json:  contentType == 'json'? true:false,

                headers:req.headers,              

              },


 

            (err, response,body)=>{

                if (!err)

                {

               

                 

                 if (contentType != 'json')

                 {

                 

                    let _txtBody = '';

                    if (body)

                    {

                      _txtBody= body.toString();

                    }


 

                    AppUtils.SaveFackData(_md5,_txtBody,extFile);

                    AppUtils.SaveFackData(_md5,apiUrl,'txt');

                 

                    res.sendRaw(body);

                 }

                 else

                 {

                    let _txtBody = '';

                    if (body)

                    {

                      _txtBody= JSON.stringify(body);

                    }

                    AppUtils.SaveFackData(_md5,_txtBody,extFile);

                    AppUtils.SaveFackData(_md5,apiUrl,'txt');

                   

                    res.send(body);

                 }

       

                }

                else

                {

                  res.send(body);

                }

              }

            );

           

       

        }

       

    }

  }

}

Utils:

import  * as  crypto  from 'crypto';

import { ApiConfig } from '../api.config';

 import { writeFileSync,readFileSync,existsSync} from 'fs';

import { join} from 'path';

import uuid, { v1 } from 'uuid';

import { UUID } from 'sequelize/types';

import { XmlHelper } from './xml.helper';

//import * as tls from 'tls'

export   class AppUtils {

    public static ConvertDateTimeMulitSecondToString(date?:Date):string {

        if (!date )

        {

          date = new Date();

        }

        //let date= new Date();

        let year:number= date.getFullYear();

        let month:string| number=date.getMonth()+1;

        let day:string| number=date.getDate();

        let hour:string| number=date.getHours()<10?"0"+date.getHours():date.getHours();

        let minute:string| number=date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes();

        let second:string| number=date.getSeconds()<10?"0"+date.getSeconds():date.getSeconds();

        let mulitsecond:string| number=date.getMilliseconds()<10?"0"+date.getMilliseconds():date.getMilliseconds();

       

        if (month<10) {

            month="0"+month;

        }

        if (day<10) {

            day="0"+day;

        }

   

        return year+ "-"+month+"-"+day+" "+hour + ":" + minute +":" + second +":" + mulitsecond;

     }

     public static ConvertDateTimeSecondToString(date?:Date):string {

        if (!date )

        {

          date = new Date();

        }

        //let date= new Date();

        let year:number= date.getFullYear();

        let month:string| number=date.getMonth()+1;

        let day:string| number=date.getDate();

        let hour:string| number=date.getHours()<10?"0"+date.getHours():date.getHours();

        let minute:string| number=date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes();

        let second:string| number=date.getSeconds()<10?"0"+date.getSeconds():date.getSeconds();

        let mulitsecond:string| number=date.getMilliseconds()<10?"0"+date.getMilliseconds():date.getMilliseconds();

       

        if (month<10) {

            month="0"+month;

        }

        if (day<10) {

            day="0"+day;

        }

   

        return year+ "-"+month+"-"+day+" "+hour + ":" + minute +":" + second  ;

     }

    public static ConvertDateTimeToString(date?:Date):string {

        if (!date )

        {

          date = new Date();

        }

        //let date= new Date();

        let year:number= date.getFullYear();

        let month:string| number=date.getMonth()+1;

        let day:string| number=date.getDate();

        let hour:string| number=date.getHours()<10?"0"+date.getHours():date.getHours();

        let minute:string| number=date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes();

        let second:string| number=date.getSeconds()<10?"0"+date.getSeconds():date.getSeconds();

     

       

        if (month<10) {

            month="0"+month;

        }

        if (day<10) {

            day="0"+day;

        }

   

        return year+ "-"+month+"-"+day+" "+hour + ":" + minute +":" + second ;

     }

     public static ConvertDateToString(date?:Date):string {

        if (!date )

        {

          date = new Date();

        }

        //let date= new Date();

        let year:number= date.getFullYear();

        let month:string| number=date.getMonth()+1;

        let day:string| number=date.getDate();

        let hour:string| number=date.getHours()<10?"0"+date.getHours():date.getHours();

        let minute:string| number=date.getMinutes()<10?"0"+date.getMinutes():date.getMinutes();

        let second:string| number=date.getSeconds()<10?"0"+date.getSeconds():date.getSeconds();

     

       

        if (month<10) {

            month="0"+month;

        }

        if (day<10) {

            day="0"+day;

        }

   

        return year+ "-"+month+"-"+day  ;

     }

   

     public static WriteLog(msg:string)

     {

         console.log(msg);

     }

     public static ReplenishLeftSpace(input:string , totalLen:number ):string

     {

        var len = this. getStringLen( input);

        if (len == totalLen)

        {}

        else if (len < totalLen)

        {

            input =  this.getSpace( totalLen - len) +  input;

        }

       

        return input;

     }

    public static getStringLen(input:string):number{  

        var   i,len,code;  

        if(input==null || input == "")   return   0;  

        len   =   input.length;  

        for   (i   =   0;i   <   input.length;i++)    

        {    

        code   =   input.charCodeAt(i);  

        if   (code   >   255) {len ++;}  

        }  

        return   len;  

    }

   

    public static getSpace(spacelen:number ):string{  

       

        let result ='';

        let len = spacelen ;// Math.ceil(spacelen/2);

        if (len>0)

        {

            for (let i = 0; i < len ; i++) {

                result = result + ' ';

            }

        }

        return result;

    }

   

    public static  PrefixInteger(num:string, length:number) {

        return (Array(length).join('0') + num).slice(-length);

    }

    public static ReplaceString(input:string,searchValue:string,replaceValue:string)

    {

        let result = '';

        for (let index = 0; index < input.length; index++) {

            let element = input[index];

            element = element.replace(searchValue,replaceValue);

            result = result + element;

        }

        return result;

    }


 

    public static formatParams(params: any): string {

        return Object.keys(params)

          .filter(k => params[k] !== undefined && params[k] !== '')

          .sort()

          .map(k => `${k}=${params[k]}`)

          .join('');

    }

   

    public static CalcMD5(input :string):string{

       

        let md5 =   crypto .createHash('md5');

        md5.update(input);

       

        return md5.digest('hex');

    }

    public static  FileExist(fileName :string):boolean{

        return existsSync( fileName);

    }

   

    public static  FackDataExist(fileName :string,ext? :string):{fileName:string ,fileExist:boolean}

    {

        let result :{fileName:string ,fileExist:boolean} ={fileName:'' ,fileExist:false};

        if (!ext)

        {

            ext ='josn';

        }

        let _fakeFile = AppUtils. GetFacDataFileName(fileName,ext);

        let _exist =  existsSync( _fakeFile);

        result.fileExist = _exist;

        if (_exist)

        {

            result.fileName = _fakeFile;

        }

        return result;

    }

    public static  SaveFackData(fileName :string,bodyTxt :any,ext?:string):string{

        let fullName = '';

        try

        {

            fullName = AppUtils. GetFacDataFileName(fileName,ext);

            //join(__dirname,'assets','fackdata','ward') + fileName + '.json';

            writeFileSync( fullName, bodyTxt, { encoding: 'utf8' , flag: 'w' } )

/*

            if (ext && ext=='json')

            {

                let _jsonBody = JSON.stringify(body);

                writeFileSync( fullName, _jsonBody, { encoding: 'utf8' , flag: 'w' } )

            }

            else  

            {

               

                let _txtBody = '';

                if (body)

                {

                 _txtBody= body.toString();

                }

                writeFileSync( fullName, _txtBody, { encoding: 'utf8' , flag: 'w' } )

            }

 */

        }

       catch(err)  {

            console.error(err);

           

       }

       

        return fullName;

         

    }

    public static  GetFackData(fileName :string):string{

     

     

      let content:string =  readFileSync(fileName,{ encoding: 'utf8', flag: 'r'  } );

      return content;

    }

    public static GetFacDataFileName(fileName: string,ext?:string): string {

        let url =  join(  __dirname,'../../','assets','fackdata',fileName);

   

        if (ext)

        {

           //url = 'http://localhost:' + ApiConfig.port + '/assets/fackdata/ward/' + fileName + '.' + ext;

           url +=  '.' + ext;

        }

        else

        {

           url +=  '.' + 'json';

        }

   

        return url;

      }


 

      public static GetRandomNum(Min:number,Max:number)

      {  

            let Range = Max - Min;  

            let Rand = Math.random();  

            return(Min + Math.round(Rand * Range));  

      }

      public static GetUUID():string{

        return uuid.v1();

      }

}





 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法题解】51. 二叉树的最近公共祖先

这是一道 中等难度 的题 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为…

【模型压缩】 LPPN论文阅读笔记

LPPN论文阅读笔记 LPPN: A Lightweight Network for Fast Phase Picking 背景 深度学习模型的问题在于计算复杂度较高&#xff0c;在实际数据处理中需要面临较高的处理代价&#xff0c;且需要专用的加速处理设备&#xff0c;如GPU。随着数据累积&#xff0c;迫切需要设计一种…

【力扣刷题 | 第二十二天】

目录 前言&#xff1a; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天我们爆刷动态规划章节的题目&#xff0c;相关的算法理论介绍我也有写过文章&#xff1a;【夜…

深度学习anaconda+pycharm+虚拟环境迁移

一、下载好anaconda和pycharm安装包。 下载anaconda:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror pycharm汉化包 二、安装anaconda 深度学习环境配置-Anaconda以及pytorch1.2.0的环境配置&#xff08;Bubbliiiing 深度学习 教程&…

RocketMQ集成Springboot --Chapter1

RocketMQ集成Springboot 三种消息发送方式 生产者 引入依赖 <!--⽗⼯程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><…

Java版本企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

放点击事件里面即可 uni.navigateToMiniProgram({appId: , //跳转的小程序的aooIdpath: pages/index/index?id123, //如果这里不填&#xff0c;默认是跳转到对方小程序的主页面extraData: { //需要传给对方小程序的数据data1: test},success(res) {// 打开成功} })

【html中的BFC是什么】

BFC&#xff08;块级格式化上下文&#xff09;是 CSS 中的一种盒模型布局&#xff0c;是指一个独立的块级容器&#xff0c;容器内部的元素会按照一定规则进行布局。 BFC 具体的规则有以下几个&#xff1a; BFC 内部的元素在垂直方向上相互排列&#xff0c;不会出现浮动的情况。…

JAVA设计模式——单例模式

单例模式是应用最广的设计模式之一&#xff0c;也是程序员最熟悉的一个设计模式&#xff0c;使用单例模式的类必须保证只能有创建一个对象。 今天主要是回顾一下单例模式&#xff0c;主要是想搞懂以下几个问题 为什么要使用单例&#xff1f; 如何实现一个单例&#xff1f; 单…

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间

第1题 取数问题 查看测评数据信息 有一排N个数&#xff0c;你和小明2个人玩游戏&#xff0c;每个人轮流从2端取数&#xff0c;每次可以从左或右取&#xff0c;不能从中间取。你取的所有的数的和是你的得分&#xff0c;小明取的所有的数的和是小明的得分。如果你先取&#x…

ISP 模块原理

图像锐化&#xff1a; 图像信号处理芯片设计原理----13 图像锐化 - 知乎 (zhihu.com) bayer /RGB去噪&#xff1a; 图像信号处理芯片设计原理——12 RAW域和YUV域上的去噪 - 知乎 (zhihu.com) 图像去噪技术简要总结 - 知乎 (zhihu.com) (72条消息) 非局部均值去噪&#xf…

【图像分割】基于蜣螂优化算法DBO的Otsu(大津法)多阈值电表数字图像分割 电表数字识别【Matlab代码#51】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始蜣螂优化算法1.1 滚球行为1.2 跳舞行为1.3 繁殖行为1.4 偷窃行为 2. 多阈值Otsu原理3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章第…

springboot 项目启动不打印spring 启动日志

今天项目遇到一个很奇怪的问题&#xff0c;服务在启动时&#xff0c;不打印spring 的启动日志。经过排查发现是因为其他的依赖引入了 log4j 的依赖&#xff0c;因为我们的项目用的是logback&#xff0c;所以项目中没有log4j 的相关配置&#xff0c;所以干扰到了日志的打印 原因…

Vue入门项目——WebApi

Vue入门——WebApi vue3项目搭建组合式API响应式APIreactive()ref() 生命周期钩子computed计算属性函数watch监听函数父子通信模板引用组合选项 vue3项目搭建 简单看下Vue3的优势吧 下载安装npm及node.js16.0以上版本&#xff08;确保安装成功可用如下代码检查版本&#xff0…

工厂电能质量治理解决方案

1、概述 谐波的危害十分严重&#xff0c;尤其在工厂这种设备较多的场合。大部分设备都是谐波源&#xff0c;谐波使电能的生产、传输和利用的效率降低&#xff0c;使电气设备过热、产生振动和噪声&#xff0c;并使绝缘老化&#xff0c;使用寿命缩短&#xff0c;甚至发生故障或烧…

RocketMQ 5.0 无状态实时性消费详解

作者&#xff1a;绍舒 背景 RocketMQ 5.0 版本引入了 Proxy 模块、无状态 pop 消费机制和 gRPC 协议等创新功能&#xff0c;同时还推出了一种全新的客户端类型&#xff1a;SimpleConsumer。 SimpleConsumer 客户端采用了无状态的 pop 机制&#xff0c;彻底解决了在客户端发布…

创作纪念日——Hello World

创作纪念日——Hello World 导读 正在报告&#xff01; ——迅捷斥候 成就 精通多种语言的Hello World 1. C #include int main() {printf("Hello, World");return(0); }2. C int main() {std::cout << "Hello World";return 0; }3. C# using…

QT字节数组类QByteArray

QT字节数组类QByteArray 初始化访问某个元素截取字符串获取字节数组的大小数据转换与处理Hex转换数值转换与输出 字母大小写转换字符串数值转化为各类数值QBQyteArray和char*互转QByteArray 和std::string互转与字符串QString互转QByteArray和自定义结构体之间的转化判断是否为…

区块链实验室(11) - PBFT耗时与流量特征

以前面仿真程序为例&#xff0c;分析PBFT的耗时与流量特征。实验如下&#xff0c;100个节点构成1个无标度网络&#xff0c;节点最小度为5&#xff0c;最大度为38. 从每个节点发起1次交易共识。统计每次交易的耗时以及流量。本文所述的流量见前述仿真程序的说明:区块链实验室(3)…

13.4.2 【Linux】sudo

相对于 su 需要了解新切换的使用者密码 &#xff08;常常是需要 root 的密码&#xff09;&#xff0c; sudo 的执行则仅需要自己的密码即可。sudo 可以让你以其他用户的身份执行指令 &#xff08;通常是使用 root 的身份来执行指令&#xff09;&#xff0c;因此并非所有人都能够…