package com.example.demo.Util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.*;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;
import java.util.Map;
public class TestDemo {
private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
private static final String HEADER_SECRET_ID = "Secret-Id";
private static final String TENANT_ID = "Tenant-Id";
private static String getHmac(String data, String key) {
try {
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKeySpec signKey = new SecretKeySpec(HexUtil.decodeHex(key), HMAC_SHA256_ALGORITHM);
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
//用给定密钥初始化 Mac 对象
mac.init(signKey);
//完成 Mac 操作
byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
return HexUtil.encodeHexStr(rawHmac);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
System.out.println("Can't get HMAC:" + e.getMessage());
return null;
}
}
public static String createParams(String secretId, String secretKey, String method, String uri, String body) {
String nonce = RandomUtil.randomNumbers(6);
long timestamp = DateUtil.current();
// 构造加密输入的sign input string
String signStr = method.toUpperCase(Locale.ROOT) + uri + body + nonce + secretId + timestamp;
String sign = getHmac(signStr, secretKey);
System.out.println("nonce:" + nonce);
System.out.println("timestamp:" + timestamp);
System.out.println("sign:" + sign);
return String.format("nonce=%s&sign=%s×tamp=%s", nonce, sign, timestamp);
}
public static Map<String, String> createHeaders(String secretId) {
Map<String, String> headers = CollUtil.newHashMap();
headers.put(HEADER_SECRET_ID, secretId);
headers.put(TENANT_ID, "10001");
headers.put("Content-Type", "application/json");
return headers;
}
public static String sendRequest(String url, String body, String secretId, String secretKey) {
String method = "POST";
String reqUrl = StrUtil.format("{}?{}", url,
createParams(secretId, secretKey, method, URLUtil.toURI(url).getPath(), body));
Map<String, String> headers = createHeaders(secretId);
HttpRequest request = HttpUtil.createRequest(Method.POST, reqUrl);
request.body(body);
request.addHeaders(headers);
String responseBody;
try (HttpResponse response = request.timeout(10000).execute()) {
responseBody = "";
if (response.getStatus() == HttpStatus.HTTP_OK) {
responseBody = response.body();
}
}
return responseBody;
}
public static void main(String[] args) {
// TODO: 这里的secretId和secretKey以及请求地址替换为实际环境上的相关内容
String secretId = "********";
String secretKey = "*******************************";
String body = "{\"tableName\":\"substation_record\",\"columns\":[{\"columnName\":\"substation_date\",\"dataType\":\"timestamp\"},{\"columnName\":\"id\",\"dataType\":\"string\"},{\"columnName\":\"substation_name\",\"dataType\":\"string\"},{\"columnName\":\"total_load\",\"dataType\":\"string\"},{\"columnName\":\"one_load_high\",\"dataType\":\"string\"},{\"columnName\":\"one_load_middle\",\"dataType\":\"string\"},{\"columnName\":\"one_load_low\",\"dataType\":\"string\"},{\"columnName\":\"two_load_high\",\"dataType\":\"string\"},{\"columnName\":\"two_load_middle\",\"dataType\":\"string\"},{\"columnName\":\"two_load_low\",\"dataType\":\"string\"},{\"columnName\":\"one_transformer_load\",\"dataType\":\"string\"},{\"columnName\":\"two_transformer_load\",\"dataType\":\"string\"},{\"columnName\":\"year_max_load\",\"dataType\":\"string\"},{\"columnName\":\"month_max_load\",\"dataType\":\"string\"},{\"columnName\":\"year_electricity_output\",\"dataType\":\"string\"},{\"columnName\":\"month_electricity_output\",\"dataType\":\"string\"},{\"columnName\":\"power_consumption\",\"dataType\":\"string\"},{\"columnName\":\"create_date\",\"dataType\":\"timestamp\"}],\"rows\":[[\"2025-07-25\",\"0881id\",\"测点名\",\"总负荷\",\"#1主变高压侧负荷\",\"#1主变中压侧负荷\",\"#1主变低压侧负荷\",\"#2主变高压侧负荷\",\"#2主变中压侧负荷\",\"#2主变低压侧负荷\",\"#1变压器负荷率\",\"#2变压器负荷率\",\"年度最大负荷\",\"月度最大负荷\",\"年度输电量\",\"月度输电量\",\"耗损电量\",\"2025-08-18\"],[\"2025-07-26\",\"0882id\",\"测点名\",\"总负荷\",\"#1主变高压侧负荷\",\"#1主变中压侧负荷\",\"#1主变低压侧负荷\",\"#2主变高压侧负荷\",\"#2主变中压侧负荷\",\"#2主变低压侧负荷\",\"#1变压器负荷率\",\"#2变压器负荷率\",\"年度最大负荷\",\"月度最大负荷\",\"年度输电量\",\"月度输电量\",\"耗损电量\",\"2025-08-18\"]]}";
String res =sendRequest("http://10.30.102.50:31600/datafocus/api/v1.0/table/import", body, secretId, secretKey);
System.out.println(res);
}
}