[JAVA] Encoder les paramètres de requête avec Uri Components Builder au printemps

environnement

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.0.RELEASE</version>
	</parent>

Instructions d'encodage

Instruisez l'encodage avec encode </ code>.

URI target = UriComponentsBuilder.newInstance()
        .scheme("http")
        .host("example.com")
        .queryParam("foo", "b&r")
        .build()
        .encode()
        .toUri();
System.out.println(target);// http://example.com?foo=b%26r

Pour utiliser fromUri </ code> dans une URL encodée, spécifiez true </ code> dans build (boolean encoded) </ code>.

URI source = new URI("http://example.com?foo=b%26r");
URI target = UriComponentsBuilder
        .fromUri(source)
        .build(true)
        .toUri();
System.out.println(target);// http://example.com?foo=b%26r

J'étais accro à

Si encode </ code> n'est pas spécifié, aucun encodage ne sera effectué.

URI target = UriComponentsBuilder.newInstance()
        .scheme("http")
        .host("example.com")
        .queryParam("foo", "b&r")
        .build()
        .toUri();
System.out.println(target); // http://example.com?foo=b&r

Si vous transmettez une URL encodée avec fromUri </ code> et ne spécifiez pas true </ code> pour build (boolean encoded) </ code>, l'encodage se produira. Par conséquent, un double codage </ b> est effectué.

URI source = new URI("http://example.com?foo=b%26r");
URI target = UriComponentsBuilder
        .fromUri(source)
        .build()
        .toUri();
System.out.println(target);// http://example.com?foo=b%2526r

référence

[SPR-14256] Doc: UriComponentsBuilder does not encode query parameters - Spring JIRA