将特殊字符作为网络参数传递
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 组件,除非我收到编码的
希望这对其他人有帮助。
更新:
我把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 组件,除非我收到编码的
希望这对其他人有帮助。