如何解决使用3条信息方案,基本URL和后缀URL构建URL / URI
我有3条信息构成一个url / uri。
String myscheme = "https";
String basePath = "www.theothercompany.com";
String suffixPath = "/api/v1/things";
如何使用(仅)上述三件事“组成”完整的URI或URL。
我已经经历了几个构造函数: https://docs.oracle.com/javase/8/docs/api/java/net/URI.html 和 https://docs.oracle.com/javase/8/docs/api/java/net/URL.html
就像我尝试过的那样:
URI x = new URI(myscheme,basePath,suffixPath);
或
URI y = new URI(myscheme,suffixPath,"");
但是我不断收到类似的东西
httpswww.theothercompany.comapi / v1 / things
很明显,删除了诸如“://”和“ /”之类的“部分”。
我没有端口,ssp或用户或文本文件...或者我在上面2个oracle链接的构造函数中看到的其他内容。
我不敢相信这阻碍了我!
下面是一些其他(已经)引入的软件包。我不想添加另一个(例如org.apache.http.client.utils.URIBuilder).....来膨胀依赖项。
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.reactive.function.client.WebClient;
和
compile group: 'org.springframework.boot',name: 'spring-boot-starter-webflux',version: springBootVersion
compile group: 'org.apache.commons',name: 'commons-lang3',version: commonsLangVersion
compile 'org.projectreactor:reactor-spring:1.0.1.RELEASE'
APPEND
好的,按照建议,我修复了3个部分的误贴。
String myScheme = "https";
String myHost = "www.theothercompany.com";
String myPath = "/api/v1/things";
java.net.URL computedFullUrl = null;
String urlToStringValue = "";
String urlToExternalFormValue = "";
String urlToUriStringValue = "";
try {
/* this works....or does not exception out */
computedFullUrl = new java.net.URL(myScheme,myHost,myPath);
if (null != computedFullUrl) {
urlToStringValue = computedFullUrl.toString();
urlToExternalFormValue = computedFullUrl.toExternalForm();
urlToUriStringValue = computedFullUrl.toURI().toString();
}
} catch (Exception ex) {
//throw new RuntimeException((ex));
// temporary swallow
String temp = ex.getMessage();
ex.printStackTrace();
}
因此上述方法有效。
我得到(所有三个“转换回完整字符串”的值):
https://www.theothercompany.com/api/v1/things
我终于想通了。
它与URI或URL无关。
当我从属性文件中读取值时,从“ / api / v1 / things”中删除了开头的“ /”
字符串中的值为“ api / v1 / things”。 (当然没有引号)。那是我的问题。
我将保留这个问题,以便其他人可以从我的人造皮书中学习。
Gaaaaaa。
解决方法
该问题部分是由于未使用正确的技术术语造成的:
-
www.theothercompany.com
是主机名,而不是“ basePath”。 -
/api/v1/things
是路径,而不是“ suffixPath”
很显然,您想构造一个 hierarchical URI,但是您使用的one of the constructors旨在构造一个 opaque URI¹,期望使用参数{{1 }},scheme
(方案的特定部分)和ssp
。
constructor’s documentation准确地描述了结果:
此构造函数首先使用给定的组件以字符串形式构建URI,如下所示:
- 最初,结果字符串为空。
- 如果给出了方案,则将其附加到结果后,然后是冒号(
fragment
)。- 如果给出了方案特定的部分,则将其附加。不是a legal URI character的任何字符都是quoted。
- 最后,如果给出了片段,则在字符串后附加一个哈希字符(
':'
),然后是该片段。任何非合法URI字符的字符都被引用。
通向'#'
。
由于您要构造由https:www.theothercompany.com#/api/v1/things
,scheme
和host
组成的分层URI,因此the second constructor是正确的选择:
path
从给定的组件构造一个分层的URI。
因此,使用public URI(String scheme,String host,String path,String fragment)
会导致new URI(myscheme,basePath,suffixPath,"")
。
将其更改为https://www.theothercompany.com/api/v1/things#
时,您会得到new URI(myscheme,null)
。
这证明了为什么命名工厂比重载的构造函数更可取,因为两个构造函数之间的语义差异只是一个参数而已,并不是很直观。
¹或通过手动指定语法元素来构建分层URI,这很少需要
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。