我正在尝试使用micrometer
获取剩余uri的指标。我读了this,this和一堆SO帖子。阅读所有这些内容后,我对此有一些疑问。
为了使micrometer
正常工作,应将uri参数化(Reference)。我假设这只是路径变量,而不是请求参数。我正确吗?
我们应该完全不使用UriComponentsBuilder
,因为我们不想将uri扩展到resttemplate
之外,而让resttemplate
为我们完成。
如果我使用此restClient.getForObject( fooSvcUrl, FooBar.class, uriVariables );
,micrometer
是否看待fooSvcUrl
,此时应对其进行参数化?我问这是因为,如果我按照以下说明操作,将无法正常工作。我对么 ? restClient.getForObject(UriComponentsBuilder.fromUriString(fooSvcUrl).buildAndExpand(uriVariables ).toUri() , FooBar.class);
我最近不得不处理所有这些问题,因此我可以给您以下答案:
1。“参数化”在这里意味着您将占位符应用到URI中,而不管它们的位置如何。基本上,只要您提供值来替换占位符,就可以对URI中的所有参数进行参数化-方案,主机,路径变量甚至查询参数。
同样,以下URI传递给RestTemplate
后将起作用:
https://www.foo.bar/baz/{id} with {"id":1}
https://www.foo.bar/baz?id={id} with {"id":1}
https://{host}/foo/{id}?target={target} with {"host":"www.foo.bar", "id":1, "target":"baz"}
2。您不应该这样做,尤其是如果您希望将保留符号放入URI中,因为UriComponentsBuilder
会尝试立即对其进行编码,从而导致RestTemplate
双击编码,先将非片段#
转换为%23
,然后转换为%2523
。
3。是的,将URI用作RestTemplate.getForObject
的参数时,应该对其进行参数化,因为采用参数值参数的重载方法将在实际执行请求之前对其进行扩展。