繁体   English   中英

UriComponentsBuilder 从现有 URI 构造 URI,无需对 URI 变量进行硬编码

[英]UriComponentsBuilder construct a URI from existing URI without hardcoding URI variables

我收到一个重定向 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();

但是当我构建时,output 看起来像这样:

http://example.com?param1=hi#/login

而不是预期的 output 这是:

http://example.com/#/login?param1=hi

如何确保正确解析我收到的重定向 URI 并在末尾添加查询参数?

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

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

所以UriComponentsBuilder正在根据规范做正确的事情。

看起来您的系统有自己的方法来使用片段在片段内提供查询参数。 不幸的是,如果你想这样做,你将不得不自己管理(和编码)这样的“参数”,然后适当地设置片段。

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

您可以通过使用第二个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();

(未经测试的代码,但希望能给你想法。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM