kettle 获取接口token + 业务接口调用
2022-06-08 本文已影响0人
一介书生独醉江湖
转换--> 新建一个转换;
一、创建生成记录
输入--> 生成记录(双击);
# 限制是运行几次接口,这里是1次;
# 字段名称自定义即可;
# api_token : token接口地址;
# method : POST;
# Content-Type : application/json;
# appid 、secret 、timestamp : 这几个参数是我这边token接口里面必须的参数;timestamp是当前时间;(这个没有设值,在后面Java脚本里面取的值)
# body 是 包含 appid 、secret 、timestamp计算后的值,所以这里也没有设值,在后面Java脚本里面取的值;
# api_url 是拿到token之后,访问业务接口的地址;
# 配置好确定即可;
image.png
二、创建Java代码脚本
脚本--> Java代码;
# 双击Main方法(Code Snippits --> Common use --> Main);
# 会生成方法名为processRow的一段代码,processRow相当于java中的main方法;
# 可以根据自己需要的逻辑,在这里编写java代码;
image.png
# **问题点:这里需要点击测试类 , 然后点确定并关闭当前窗口;
# 重新进入Java代码组件,参数才会显示出来;
# 否则会有 Kettle java组件getting feilds ...please wait问题;
image.png
image.png
# 这里需要注意,需要引入的跟java代码中一样需要import;
# 如果使用到了jar包中的类,需要把jar包copy到kettle解压目录/lib中;(这个后面也有说明)
# 下面是脚本代码示例:
import java.security.MessageDigest;
private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
public boolean processRow(StepMetaInterface smi , StepDataInterface sdi) throws KettleException{
Object[] r = getRow();
if(r == null){
setOutputDone();
return false;
}
if(first){
first = false;
}
Object[] outputRow = createOutputRow(r , data.outputRowMeta.size());
String appid = get(Fields.In , "appid").getString(r);
String secret = get(Fields.In , "secret").getString(r);
long timestamp = System.currentTimeMillis();
String signStr = "appid=" + appid + "&secret=" + md5(secret) + "×tamp=" + timestamp;
String sign = md5(signStr);
String body = "{\"appid\": \"" + appid + "\",\"sign\": \"" + sign + "\",\"timestamp\": "+timestamp+"}";
get(Fields.Out,"timestamp").setValue(outputRow , timestamp);
get(Fields.Out,"body").setValue(outputRow , body);
putRow(data.outputRowMeta , outputRow);
return true;
}
public static String md5(String origin) {
String resultString = null;
try {
resultString = origin;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(resultString.getBytes("UTF-8"));
resultString = byteArrayToHexString(md.digest());
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
protected static String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (byte aB : b) {
resultSb.append(byteToHexString(aB));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
# 由于我这里Java脚本,需要用到rt.jar包中的MessageDigest.java
# 所以我这里将rt.jar copy到kettle的解压目录/lib下
cp /Users/ds/Desktop/rt.jar /Users/ds/Documents/data-integration/lib
# 保存并关闭当前spoon,重新启动spoon;
三、创建REST client
查询-->REST client(双击);
# 这个client是调用token接口的;
image.png
# api_token_result 实际返回的结果大概是这种数据结构;
# 所以如果要用,还需要JSON解析,这个后面有说;
{
"code":0,
"message":"",
"recvTime":1654677126428,
"respTime":1654677126605,
"extendData":{
"appid":"ccb",
"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkb2kiLCJPUkd.....",
"expire":"20220609163206",
"sign":""
}
}
run 运行kettle
image.png
# 到这里获取token就完毕了,下面是以这个token为参数访问其他接口;
四、JSON解析
输入--> JSON input
# 上面提过token接口返回的是一个JSON,需要JSON解析,提取出真正的token;
image.png
image.png
五、创建REST client
# 这个client是调用业务接口的;
# Field 是上一步解析的字段名称;
# Name 是业务接口中的参数名;
image.png
image.png
# 最终展示
image.png
参考:
https://blog.csdn.net/mapleqn/article/details/119822391
http://www.kettle.net.cn/2204.html
https://www.codenong.com/cs106281098/
https://www.pianshen.com/article/43451323358/
https://wenku.baidu.com/view/875a9511ed06eff9aef8941ea76e58fafab04592.html