逻辑暴露为 OpenAPI
1 说明
支持将逻辑接口暴露到指定 path,并允许通过签名进行访问
2 配置
2.1 全局配置
应用设置-开放性配置中可维护开放性相关的配置信息,第三方服务端可根据此处的 ID 和密钥以及逻辑内配置的 path,调用本应用内暴露的逻辑流。建议针对每个与该应用进行对接的服务端单独维护相应的接入信息。
点击右上角[新增接入信息]按钮,可在弹窗内维护接入方标识、客户端 ID、客户端密钥、默认接口频次、有效时间等信息。其中
- 接入方标识:仅作为可读性标识信息,不限制格式,长度限制 30 以内
- 客户端 ID:由系统自动生成,不可修改
- 客户端密钥:自动生成,用户可自行修改,长度 10 到 50,英文字母和符号组成
- 默认接口频次:该应用所有开放接口的默认频次,某条逻辑内未设置接口频次时,均使用默认频次
- 有效期:可设置为长期有效或指定时间失效
2.2 逻辑内配置
点击每条逻辑右上角的[API]按钮进入弹窗配置
- 暴露为 OpenAPI:开关控制,是否允许外部直接通过签名调用
- 接口频次:接口每秒钟允许调用的次数,可以不配置,不配置情况下,使用全局设置的默认频次控制。
- path:接口发布后的接口地址,baseUrl+path 为完整地址
3 签名方式
package com.xuelangyun.gonggong.common.core.utils.sign;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.xuelangyun.gonggong.common.core.constants.CacheConstants;
import com.xuelangyun.gonggong.common.core.exceptions.LoginValidateException;
import com.xuelangyun.gonggong.common.core.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
<em>/**</em>
<em> * 接口参数加密工具类</em>
<em> *</em>
<em> * </em><strong>@author </strong><em>by milu on 2022/3/25</em>
<em> */</em>
@Slf4j
public class SignUtils {
private static final String <em>PARAM_SIGN </em>= "sign";
private static final String <em>PARAM_TIME </em>= "time";
private static final DateTimeFormatter <em>formatter </em>= DateTimeFormatter.<em>ofPattern</em>("yyyyMMddHHmmss");
<em>/**</em>
<em> * </em><strong>@param </strong><em>params 业务参数</em>
<em> * </em><strong>@param </strong><em>time yyyyMMddHHmmss 格式</em>
<em> * </em><strong>@param </strong><em>appKey</em>
<em> * </em><strong>@return </strong><em>签名</em>
<em> */</em>
<em> </em>public static String getSign(Map<String, Object> params, String time, String appKey) {
List<String> keyList = params.keySet().stream().sorted().collect(Collectors.<em>toList</em>());
List<String> paramStrList = Lists.<em>newArrayList</em>();
for (String key : keyList) {
if (Objects.<em>isNull</em>(params.get(key))) {
continue;
}
paramStrList.add(key + "=" + params.get(key));
}
paramStrList.add("time=" + time);
paramStrList.add("appKey=" + appKey);
return DigestUtils.<em>md5Hex</em>(StrUtil.<em>join</em>("&", paramStrList));
}
}
4 调用说明
请求中必须包含以下头信息
key | 说明 | 样例 |
---|---|---|
Content-Type | 标识传输的数据的格式和类型 | application/json |
Accept | 标识接收的数据的格式和类型 | / |
App-Id | 应用的 ID | 3804640615665280 |
Page-Type | 运行状态 | 2 |
Tenant-Id | 租户 ID | 2989105301970944 |
Instance-Id | 运行实例的 ID | 1df7271b5c3e4349a0c557c9468a1cca |
time | 请求时间(yyyyMMddHHmmss) | time |
sign | 签名,方式参考上面 | sign |
Client-Id | 客户端 ID | ceshi1 |
生成签名时,将逻辑参数转为 JSONString,以{"data":"params"}格式进行签名。
5 demo
public static void main(String[] args) {
Map<String, Object> param = ImmutableMap.<em>of</em>("data", "{\"name\":\"xuelangyun\",\"age\":\"18\"}");
String time = LocalDateTime.<em>now</em>().format(DateTimeFormatter.<em>ofPattern</em>("yyyyMMddHHmmss"));
String sign = SignUtils.<em>getSign</em>(param, time, "ceshiceshi2");
Map<String, List<String>> headers = Maps.<em>newHashMap</em>();
headers.put("Content-Type", Lists.<em>newArrayList</em>("application/json"));
headers.put("Accept", Lists.<em>newArrayList</em>("*/*"));
headers.put("App-Id", Lists.<em>newArrayList</em>("3804640615665280"));
headers.put("Page-Type", Lists.<em>newArrayList</em>("2"));
headers.put("Tenant-Id", Lists.<em>newArrayList</em>("2989105301970944"));
headers.put("Instance-Id", Lists.<em>newArrayList</em>("1df7271b5c3e4349a0c557c9468a1cca"));
headers.put("time", Lists.<em>newArrayList</em>(time));
headers.put("sign", Lists.<em>newArrayList</em>(sign));
headers.put("Client-Id", Lists.<em>newArrayList</em>("ceshi1"));
String body = HttpUtil.<em>createPost</em>("http://10.88.40.43/dev/gonggong/microflow/mf/trigger/open/api/v1/test")
.header(headers)
.body(JSON.<em>toJSONString</em>(param))
.execute()
.body();
System.<em>out</em>.println(body);
}