code: private static String getCanonicalHeaders(HashMap<String, String> headers) {
          if (headers.isEmpty()) {
              return "";
          }
          TreeSet<String> headerSet = new TreeSet<String>();
          for (Map.Entry<String, String> entry : headers.entrySet()) {
              String key = entry.getKey().trim().toLowerCase();
              if (key.startsWith(AipClientConst.BCE_PREFIX)
                      || AipClientConst.BCE_HEADER_TO_SIGN.contains(key)) {
                  headerSet.add(String.format("%s:%s", Util.uriEncode(key, true),
                          Util.uriEncode(entry.getValue().trim(), true)));
              }
          }
  
          return Util.mkString(headerSet.iterator(), '\n');
      }
docs: /*
  对部分header名称及参数进行编码，默认使用：
  1. host
  2. content-md5
  3. content-length
  4. content-type
  5. 所有以x-bce-开头的header项