Spring 的 URIComponentsBuilder 将端口号的冒号 (:) 转换为斜线 (/)
Spring's URIComponentsBuilder converts colon (:) for port number into slash (/)
在测试中,我将一个示例 URL 与冒号表示端口号 ("http://example.com:port") 注入到我的配置中,然后我的生产代码使用它来构造一个UriComponentsBuilder
最终创建一个 URI 字符串。
但是,该冒号字符正被 UriComponentsBuilder
转换为正斜杠,如 MCVE 中所示:
@Test
public void portNumberFromHttpUrl() {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:port");
String uriString = builder.toUriString();
assertThat(uriString).isEqualTo("http://example.com:port");
}
本次测试失败如下:
org.junit.ComparisonFailure:
Expected :"http://example.com:port"
Actual :"http://example.com/port"
为什么 :
被转换为 /
?
MCVE 几乎立即帮我自己回答了这个问题,但我会把问题留在这里,因为我在这里或网上其他任何地方都找不到相同的问题,我想这可能会节省其他人一些时间:
看来UriComponentsBuilder
认识到一个端口应该是一个数字,所以这个(更现实的)案例通过了:
@Test
public void portNumberFromHttpUrl() {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:123");
String uriString = builder.toUriString();
assertThat(uriString).isEqualTo("http://example.com:123");
}
从更多的调查来看,它似乎在 :
之后遇到的第一个非数字字符之前放置了 /
,因此:
http://example.com:a123
-> http://example.com/a123
http://example.com:12a3
-> http://example.com:12/a3
http://example.com:123a
-> http://example.com:123/a
不是很明显,但我想是有道理的。
在测试中,我将一个示例 URL 与冒号表示端口号 ("http://example.com:port") 注入到我的配置中,然后我的生产代码使用它来构造一个UriComponentsBuilder
最终创建一个 URI 字符串。
但是,该冒号字符正被 UriComponentsBuilder
转换为正斜杠,如 MCVE 中所示:
@Test
public void portNumberFromHttpUrl() {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:port");
String uriString = builder.toUriString();
assertThat(uriString).isEqualTo("http://example.com:port");
}
本次测试失败如下:
org.junit.ComparisonFailure:
Expected :"http://example.com:port"
Actual :"http://example.com/port"
为什么 :
被转换为 /
?
MCVE 几乎立即帮我自己回答了这个问题,但我会把问题留在这里,因为我在这里或网上其他任何地方都找不到相同的问题,我想这可能会节省其他人一些时间:
看来UriComponentsBuilder
认识到一个端口应该是一个数字,所以这个(更现实的)案例通过了:
@Test
public void portNumberFromHttpUrl() {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:123");
String uriString = builder.toUriString();
assertThat(uriString).isEqualTo("http://example.com:123");
}
从更多的调查来看,它似乎在 :
之后遇到的第一个非数字字符之前放置了 /
,因此:
http://example.com:a123
-> http://example.com/a123
http://example.com:12a3
-> http://example.com:12/a3
http://example.com:123a
-> http://example.com:123/a
不是很明显,但我想是有道理的。