原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
REST服务是目前接口调用最通用的方式,通用性似乎都超过了WEBSERVICE. 大部分的互联网公司都是用REST方式发布自己的服务.
并且通过https(加密), token(令牌),sign(签名)等机制确保通讯安全.
**本文主要讲解怎么通过CPI透传REST服务,并且在CPI中实现获取token及按特定算法加密获取sign(签名)**
感谢黄顾问配置IFlow,给作者机会学习IFow中的脚本写法.
二
Token and Sign
百度了一下Token和Sign的定义.
三
获取token(令牌)
一般的系统会发布一个特定的地址,用来供外围系统调用获取token.
比如腾讯企业微信的API中就有一个获取token的服务, token 一般会有个有效期, 在有效期内,token可以重复使用.
在所有其它REST服务中, 都需要在http header 或者 报文中添加 access_token.
服务对接收的token执行验证,验证通过再继续后续的处理.
四
获取sign(签名)
签名是对本次调用内容的合法性验证.
一般的签名算法是通过把报文的内容按特定规则组合,进行一次或多次MD5加密.
服务器会按照相同的算法再次加密,并且把加密后获取的sign与传输的sign 进行对比,通过后才进入服务的后续处理逻辑
五
CPI透传REST
CPI透传JSON的配置非常简单, 相对复杂的是在这个过程中获取token及签名
该配置的大致逻辑
• 检查传入的JSON中是否存在token,如果存在,则直接进入签名逻辑.
• 如果不存在token,准备调用token的报文,调用服务,获取token,并把获取的token加入报文中
• 按服务提供方提供的签名算法,执行加密过程
• 把签名结果加入报文中,调用REST服务
• 在返回结果中补充token信息,返回给调用方
• 如果调用方传入标记(只获取token和sign),则直接返回获取的token和sign.
_**01** _
**IFlow runtime configuration**
在IFlow的空白处点击,拖出底部窗口, 可以修改 runtime configuration. 这里可以限制https 允许的抬头参数
_**02** _
**CHECK TOKEN**
该节点是个脚本节点.通过GROOVY脚本获取报文信息,判断是否传入了token. 并且把传入报文的通用参数写入消息属性, 以便后续使用(包括原始报文).
_**03** _
**with token**
如果传入了有效的token.(token的有效性在发出系统判断,根据token的失效时间判断),直接执行签名步骤
_**04** _
**准备获取token的报文**
_**05** _
**token sign**
对获取token的报文添加签名. 通过脚本添加签名
_**06** _
**调用token获取**
通过 request replay 节点 调用外部系统的token服务, 获取token信息
_**07** _
**process token**
处理令牌
脚本节点, 通过脚本处理获取的token .
获取原始报文,添加token节点,同时把token相关信息写入消息的属性.以便后续使用
_**08** _
**获取签名失败**
如果获取签名失败, 结束
_**09** _
**sign**
签名,脚本节点
对于补充了token的原始报文,添加签名信息
_**10** _
**仅返回签名**
如果调用方传递了抬头参数 get_token_sign. CPI获取token和签名后结束IFlow, 原报文添加token和签名后返回
这个参数的目的: 通过POSTMAN测试目标系统的服务比较麻烦, 所以可以通过CPI服务添加get_token_sign参数来获取该接口的 token
,sign 信息, 然后补充在posman中,以便测试接口
_**11** _
**调用外部系统的服务**
通过request reply 节点调用外部系统的正式服务, 传递的报文在原报文基础上补充了token 及sign 部分.
_**12** _
**return token**
脚本节点
把token补充到外部服务返回的信息中.
以便调用系统能够保存token并在下次调用时根据token的失效日期判断是否可以直接使用.以便提高接口的效率(不必每次都调用获取token的接口)
六
S4/ECC端的调用
> S4/ECC端调用CPI详见链接 无峰,公众号:ABAP 技巧与实战 [ CPI系列 通用接口-数据写入FTP服务器csv文件
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247487765&idx=1&sn=9a6a32c1dcd4711fb450c9cbb98f5431&chksm=cf5dcc23f82a4535a26f8753c6bd8e22f98ae1bfc2fb7264f5eb6e5df2a63c36e51d6a904f2a&token=2075697913&lang=zh_CN#rd)
需补充token的存储及有效token的使用逻辑
七
总结
通过rest方式 传输json报文可以让系统设计一个通用接口, 通过报文的内容识别具体传递的内容及后续处理方式.
CPI对于这类接口只需要把发出系统的报文透传到目标系统(需要的话,补充token获取或sign获取逻辑,
把相关信息补充到源报文中,再调用目标系统的REST服务).
本文给出了一个CPI通用的处理方式. 其中SIGN签名算法依赖于目标系统给出的逻辑. 其它部分比较通用.
groovy 脚本在CPI中可以比较方便的处理传递的消息.
groovy脚本中通过对message 的抬头,属性及body 的处理,可以改变源系统传递的报文内容.
groovy脚本中通过message 的属性,可以在各脚本间传递变量内容
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论