[英]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.