Supposons que vous souhaitiez encoder les paramètres de requête avec un code comme celui-ci.
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("key", "a+b");
String u = UriComponentsBuilder.fromHttpUrl("http://www.google.com").queryParams(params).build().encode().toString();
System.out.println(u);
Le résultat du code ci-dessus dépend de la version de spring-web, comme indiqué dans le tableau ci-dessous.
spring-version web | résultat |
---|---|
spring-boot1(spring-web-4.3.18.RELEASE) | http://www.google.com?key=a%2Bb |
spring-boot2(spring-web-5.0.4.RELEASE) | http://www.google.com?key=a+b |
"+" N'est plus encodé dans la nouvelle version 5.0.
Comme mentionné autour de https://stackoverflow.com/questions/50432395/whats-the-proper-way-to-escape-url-variables-with-springs-resttemplate-when-ca, implémentation de l'encodage des paramètres de requête A changé pour la base RFC 3986, donc en quelque sorte.
Vérifiez la mise en œuvre. Une classe appelée HierarchicalUriComponents est en fait en charge de l'encodage, et il y a une partie à l'intérieur qui détermine s'il s'agit ou non d'une cible d'encodage.
C'est le cas en 4.3.
QUERY_PARAM {
@Override
public boolean isAllowed(int c) {
if ('=' == c || '+' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
}
},
Dans la version 5.0, c'est le cas et vous pouvez voir que le "+" est désactivé.
QUERY_PARAM {
@Override
public boolean isAllowed(int c) {
if ('=' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
}
},
Recommended Posts