前几天在对接二方接口的过程中,遇到了一些困难,趁着周末有时间,记录下来,一来自己作为一个复习笔记,二来给后来人做一个参考。
问题背景
我用 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