首页 > 编程语言 >各大编程语言接口对接中的签名对接

各大编程语言接口对接中的签名对接

时间:2023-03-19 14:46:17浏览次数:32  
标签:map 20 编程语言 stringBuilder 对接 接口 34 put append

前几天在对接二方接口的过程中,遇到了一些困难,趁着周末有时间,记录下来,一来自己作为一个复习笔记,二来给后来人做一个参考。

问题背景

我用 Java 对接 C# 开发的接口时,签名总是对不上,发现是两侧的签名字符串压根就不一致,难怪签出签名都不一致。

虽然 C# 那边告知我的是,她使用的是字典序排序签名要素。可我这边无论怎样签名,都跟她的签名要素顺序不一致。

最后才发现她使用的 C# 排序算法,是按照字母表顺序排序,就是小写字母在前,大写字母在后。根本就不是我们常见的字典序,我们常见的字典序是按照 ASCII 表的顺序来排序。

即,大写字母 ASCII 值小于小写字母,所以大写字母在前,小写字母在后。

C# 中的字典序

// TODO

Java 中的字典序

方法一:利用有序 Map 来包装 HashMap

Map<String, Object> map = new HashMap<>(4);
map.put("Asia", 23);
map.put("Duty", 34);
map.put("Company", 20);
map.put("Beyond", 34);
TreeMap<String, Object> treeMap = new TreeMap<>(map);

System.out.println(treeMap);
// {Asia=23, Beyond=34, Company=20, Duty=34}

方法二:获取 HashMap 的 key 的无序集合 ArrayList 来排序

Map<String, Object> map = new HashMap<>(4);
map.put("Asia", 23);
map.put("Duty", 34);
map.put("Company", 20);
map.put("Beyond", 34);
Set<String> keySet = map.keySet();
List<String> list = new ArrayList<>(keySet);
Collections.sort(list);
StringBuilder stringBuilder = new StringBuilder();
for (String key : list) {
    stringBuilder.append(key).append("=").append(map.get(key)).append("&");
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);

System.out.println(stringBuilder);
// Asia=23&Beyond=34&Company=20&Duty=34

获取 HashMap 的 key 的有序集合 TreeSet 来排序

Map<String, Object> map = new HashMap<>(4);
map.put("Asia", 23);
map.put("Duty", 34);
map.put("Company", 20);
map.put("Beyond", 34);
Set<String> keySet = map.keySet();
TreeSet<String> treeSet = new TreeSet<>(keySet);
StringBuilder stringBuilder = new StringBuilder();
for (String key : treeSet) {
    stringBuilder.append(key).append("=").append(map.get(key)).append("&");
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);

System.out.println(stringBuilder);
// Asia=23&Beyond=34&Company=20&Duty=34

JDK1.8 版本可以使用 Stream API 排序

Map<String, Object> map = new HashMap<>(4);
map.put("Asia", 23);
map.put("Duty", 34);
map.put("Company", 20);
map.put("Beyond", 34);
StringBuilder stringBuilder = new StringBuilder();
Stream<Map.Entry<String, Object>> sorted = map.entrySet().stream().sorted(Map.Entry.comparingByKey());
sorted.forEach(stringObjectEntry -> stringBuilder.append(stringObjectEntry.getKey()).append("=").append(stringObjectEntry.getValue()).append("&"));
stringBuilder.deleteCharAt(stringBuilder.length() - 1);

System.out.println(stringBuilder);
// Asia=23&Beyond=34&Company=20&Duty=34

PHP 中的字典序

$arr = [
    'Asia' => 23,
    'Duty' => 34,
    'Company' => 20,
    'Beyond' => 34,
];
ksort($arr);

print_r($arr);
// array('Asia' => 23, 'Beyond' => 34, 'Company' => 20, 'Duty' => 34)

标签:map,20,编程语言,stringBuilder,对接,接口,34,put,append
From: https://www.cnblogs.com/okbuok/p/17233024.html

相关文章