将特殊字符作为网络参数传递

passing special characters as web parameters

更新:

我把web参数定义为const map = new Map();然后我将值放入 map.set(metaById[i].id, metadatoForm[i]);

在 Angular 端(通过浏览器控制台)我可以看到该项目已正确传递,但在 Java 端我收到一个奇怪的对象,它的大小不正确并且它是空的(它也有空的键集)

 @RequestParam Map<Integer,String> mapQuery) {
 ...
 System.out.println(mapQuery.size()); // always 1 even if hte map has more elements
 System.out.println(mapQuery.get(3)); // null

旧 POST

这是我的情况:

在我的 Web 应用程序中,用 Angular 4 编写,我调用 Web 服务并传递此 Web 参数

const param = 'map=' + map;

这张地图不是真正的地图,而是一个具有这种结构的数组:

map=1:RUFUS,2:QUATTRO,3:21/01/01   .... and so on

在 web 服务上,我解析了这个 web 参数并创建了一个包含该内容的 java 地图。

问题是当 web 参数里面有这个符号之一时,“+” “,“ 和 ”%”。我无法过滤它们(用户可以键入它们)并且我不知道为什么在 java 一侧加号被视为空字符(“”), , 被视为数组分隔符(所以它 returns 当我拆分 web 参数来解析它时出错)并且 % 被视为无效的 web 转义字符。

我考虑了 2 个解决方案,但其中 none 个解决方案适用于所有三个符号:

1) typescript encodeUrl 或 encodeUrlComponents 函数

2) 修改web参数类型,(怎么直接传一个map??

下面是我如何解析 http-request 参数:

Map<Integer, String> mappaQuery = new HashMap<Integer, String>();
for (String item : arrayQuery) {
    String split[] = item.split(":");
    mappaQuery.put(Integer.valueOf(split[0]), split[1]);
}

感谢您的帮助。不知道我写的够不够清楚,欢迎评论,我会尽量补充,英语不是我的主要语言。

在您的 Angular 应用中试试这个:

class CustomEncodingCodec implements HttpParameterCodec {
  private customEncoding(v: string): string {
    return encodeURIComponent(v)
      .replace(/%3A/gi, ':')
      .replace(/%24/gi, '$')
      .replace(/%2C/gi, ',')
      .replace(/%3B/gi, ';')
      .replace(/%3D/gi, '=')
      .replace(/%3F/gi, '?')
      .replace(/%2F/gi, '/'); 
  }

  encodeKey(k: string): string { return this.customEncoding(k); }
  encodeValue(v: string): string { return this.customEncoding(v); }
  decodeKey(k: string): string { return decodeURIComponent(k); }
  decodeValue(v: string) { return decodeURIComponent(v); }
}

let httpParams = new HttpParams( { fromString: '', encoder: new CustomEncodingCodec() } );

然后将您的参数从地图传递到 httpParams。

更多信息:https://angular.io/api/common/http/HttpUrlEncodingCodec

希望对您有所帮助。

我已经成功了,即使这不是最优雅的方式。 由于我的应用程序模块中的特殊情况(Angular 调用 REST WS,并且需要传递类似元素的地图),我不得不接受此解决方案。如果我找到更好的解决方案,我会在这里写主题。

在 Typescrypt 部分,我在搜索并替换“,”字符后对发送的数据进行了编码。我用过 |而不是 : 作为数组中的 K/V 分隔符。

nome.trim().replace(',', '%2C');
...
array.push(this.metaById[i].id + '|' + encodeURIComponent(this.metadatoForm[i]));

在 java 方面,解决方案不是那么优雅,但它涵盖了所有可能性:

Map<Integer, String> mappaQuery = new HashMap<Integer, String>();
    for (String item : arrayQuery) {
        String split[] = item.split("\|");
        if (split.length >= 2) {
            if (item.contains("%2C")) {
                mappaQuery.put(Integer.valueOf(split[0]), URLDecoder.decode(split[1], "UTF-8"));
            } else {
                mappaQuery.put(Integer.valueOf(split[0]), split[1]);
            }
        } else if (split.length == 1) {
            mappaQuery.put(Integer.valueOf(split[0]), "|");
        }
    }

这样我就可以顺利通过 , : % + 和 |在搜索中。注意我不会解码 URI 组件,除非我收到编码的

希望这对其他人有帮助。