spring UriComponentsBuilder从现有URI构造URI,而无需硬编码URI变量

zhte4eai  于 2022-12-17  发布在  Spring
关注(0)|答案(2)|浏览(248)

我收到一个重定向URI作为一个字符串,它是这样的东西-http://example.com/#/login
它也可以是任意的URI字符串,比如
http://example.com/#/login?param1=hi或此-http://example.com
我必须原样使用那个URI并添加一些查询参数。
我像这样构造URI。

UriComponentsBuilder.fromUri("http://example.com/#/login")
                    .queryParam("param1", "hi")
                    .build();

但当我构建时,输出如下所示:
http://example.com?param1=hi#/login
而不是预期的结果是这样的
http://example.com/#/login?param1=hi
我怎样才能确保我收到的重定向URI被正确解析,并且在末尾添加了查询参数?

vhmi4jdf

vhmi4jdf1#

散列之后的所有内容都被称为“片段”。URI语法(在RFC 3986中定义)将查询参数放在片段之前。

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

因此,UriComponentsBuilder根据规范执行了正确的操作。
看起来您的系统有自己的方法使用片段在片段中提供 pseudo 查询参数,不幸的是,如果您想这样做,您将不得不自己管理(和编码)这样的“参数”,然后适当地设置片段。

UriComponentsBuilder.fromUri("http://example.com/")
                .fragment("/login?param1=hi")
                .build();

你可以使用一个 second UriComponentsBuilder来管理你想在片段中结束的路径和参数,然后build()那个,提取你想要的部分,并把它们放在片段中。

UriComponents fragmentUri = UriComponentsBuilder.fromUri("http://unused/")
                .path("/login")
                .queryParam("param1", "hi")
                .build();

UriComponents uri = UriComponentsBuilder.fromUri("http://example.com/")
                .fragment(fragmentUri.getPath() + "?" + fragmentUri.getQuery())
                .build();

(未测试的代码,但希望能给您一些启发。)

tyu7yeag

tyu7yeag2#

var uriBuilder = UriComponentsBuilder.fromHttpUrl("http://example.com").path("#/login");
uriBuilder.queryParam("email", emailReciepient);
uriBuilder.queryParam("key", jobKey).build().toString();

这是实现它的方法,因为路径将按原样读取,

相关问题