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\":\"power_plant_info\",\"columns\":[{\"columnName\":\"point_name\",\"dataType\":\"string\"},{\"columnName\":\"id\",\"dataType\":\"string\"},{\"columnName\":\"power_name\",\"dataType\":\"string\"},{\"columnName\":\"power_addr\",\"dataType\":\"string\"},{\"columnName\":\"commissioning_date\",\"dataType\":\"timestamp\"},{\"columnName\":\"sum_capacity\",\"dataType\":\"string\"},{\"columnName\":\"power_image_url\",\"dataType\":\"string\"},{\"columnName\":\"power_recommend\",\"dataType\":\"string\"},{\"columnName\":\"invoke_date\",\"dataType\":\"timestamp\"},{\"columnName\":\"space_area\",\"dataType\":\"string\"},{\"columnName\":\"architecture_area\",\"dataType\":\"string\"},{\"columnName\":\"staff_number\",\"dataType\":\"int\"},{\"columnName\":\"enterprise_culture\",\"dataType\":\"string\"},{\"columnName\":\"consumption_rate\",\"dataType\":\"string\"},{\"columnName\":\"electricity_cost\",\"dataType\":\"string\"},{\"columnName\":\"data_type\",\"dataType\":\"string\"},{\"columnName\":\"generate_type\",\"dataType\":\"string\"},{\"columnName\":\"year_electricity_target\",\"dataType\":\"string\"},{\"columnName\":\"create_date\",\"dataType\":\"timestamp\"}],\"rows\":[[\"测点名\",\"0881id\",\"电厂名称\",\"厂区地址\",\"2025-08-19\",\"总装机容量\",\"厂区图片url\",\"厂站简介\",\"2024-09-11\",\"占地面积\",\"建筑面积\",12,\"企业文化\",\"厂用电率\",\"供电度电成本\",\"数据类型\",\"生产类型\",\"年发电目标\",\"2025-08-19\"]]}";
String res =sendRequest("http://10.30.102.50:31600/datafocus/api/v1.0/table/import", body, secretId, secretKey);
System.out.println(res);
}
}