Skip to main content

逻辑暴露为 OpenAPI

1 说明

支持将逻辑接口暴露到指定 path,并允许通过签名进行访问

2 配置

2.1 全局配置

应用设置-开放性配置中可维护开放性相关的配置信息,第三方服务端可根据此处的 ID 和密钥以及逻辑内配置的 path,调用本应用内暴露的逻辑流。建议针对每个与该应用进行对接的服务端单独维护相应的接入信息。

点击右上角[新增接入信息]按钮,可在弹窗内维护接入方标识、客户端 ID、客户端密钥、默认接口频次、有效时间等信息。其中

  1. 接入方标识:仅作为可读性标识信息,不限制格式,长度限制 30 以内
  2. 客户端 ID:由系统自动生成,不可修改
  3. 客户端密钥:自动生成,用户可自行修改,长度 10 到 50,英文字母和符号组成
  4. 默认接口频次:该应用所有开放接口的默认频次,某条逻辑内未设置接口频次时,均使用默认频次
  5. 有效期:可设置为长期有效或指定时间失效

2.2 逻辑内配置

点击每条逻辑右上角的[API]按钮进入弹窗配置

  1. 暴露为 OpenAPI开关控制,是否允许外部直接通过签名调用
  2. 接口频次接口每秒钟允许调用的次数,可以不配置,不配置情况下,使用全局设置的默认频次控制。
  3. 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应用的 ID3804640615665280
Page-Type运行状态2
Tenant-Id租户 ID2989105301970944
Instance-Id运行实例的 ID1df7271b5c3e4349a0c557c9468a1cca
time请求时间(yyyyMMddHHmmss)time
sign签名,方式参考上面sign
Client-Id客户端 IDceshi1

生成签名时,将逻辑参数转为 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);
}