将特殊字符作为Web参数传递

时间:2017-10-17 10:18:31

标签: java angular web-services http-post url-parameters

UPDATE:

我将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

旧帖子

这是我的情况:

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

const param = 'map=' + map;

此地图不是真实地图,而是具有此结构的数组:

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

在Web服务上,我解析此Web参数并创建包含该内容的Java Map。

问题是当在web参数中有一个这样的符号时,“+”  “,”和“%”。我无法过滤它们(用户可以输入它们)而且我不知道为什么在java端加上被视为空char(“”),它被视为数组分隔符(所以当我分裂时它会返回错误)用于解析它的web参数),%被视为无效的Web转义字符。

我想到了两个解决方案,但它们都没有适用于所有三个符号:

1)typescript encodeUrl或encodeUrlComponents函数

2)更改web参数类型,(如何直接传递地图??

以下是我解析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]);
}

感谢您的帮助。我不知道我输入的内容是否足够清楚,请评论,我会更好地添加,英语不是我的主要语言。

2 个答案:

答案 0 :(得分:0)

在你的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

希望它会有所帮助。

答案 1 :(得分:0)

我已经成功了,即使它不是最优雅的方式。 我不得不接受这个解决方案,因为我在我的应用程序模块中具有特殊情况(Angular是一个REST WS,需要传递像元素一样的地图)。如果我能找到更好的解决方案,我会在这里写主题。

在Typescrypt部分,我在搜索和替换&#34;,&#34;之后对发送的数据进行了编码。字符。我用过|而不是:作为我的数组中的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组件,除非我收到编码的

希望这有助于其他人。