具有不记名授权的 RestTemplate

svr*_*jak 7 java spring resttemplate spring-boot

是否可以使用 RestTemplateBuilder 创建仅包含不记名标头和令牌的 RestTemplate 实例?

我知道我可以使用 RestTemplate 交换并在 HttpEntity 中设置我的标头,但是否可以执行以下操作:

public RestTemplate getRestTemplate(){
    RestTemplateBuilder builder = new RestTemplateBuilder();
    return builder.build().exchange().setBearerAuth("token here"); //this is not possible
}
Run Code Online (Sandbox Code Playgroud)

希望你明白我想做什么。

ksy*_*sha 6

正如lilalinux在评论中指出的那样 - 授权是标头的名称,承载 + 令牌本身是值。

@Bean(name = "myRestTemplate")
public RestTemplate collectCentRestTemplate(RestTemplateBuilder builder) {
    return builder.rootUri("some uri")
            .additionalInterceptors((ClientHttpRequestInterceptor) (request, body, execution) -> {
                request.getHeaders().add("Authorization", "Bearer " + token);
                return execution.execute(request, body);
            }).build();
}
Run Code Online (Sandbox Code Playgroud)


use*_*900 0

不,有人建议并拒绝为 RestTemplateBuilder 中的 Headers 提供便捷方法

我认为目前最简单的方法是做这样的事情:

RequestEntity<Void> request = RequestEntity.post(url)
    .accept(MediaType.APPLICATION_JSON).header("foo", "bar").build();
restTemplate.exchange(request, String.class);
Run Code Online (Sandbox Code Playgroud)

我倾向于同意 @wilkinsona 的观点,即添加额外的说服方法可能不如当前的 basicAuthorization 方法有用。这个很常见,当它被添加时,你自己编写代码是非常痛苦的(自从 Spring 4.3.1 添加了 BasicAuthorizationInterceptor 类以来,现在变得更容易了)。

我们需要平衡任何新的便捷方法的便利性和做同一件事的太多方法的复杂性。由于为任何需要此行为的应用程序插入 RestTemplateCustomizer 相对容易,因此我认为我们不应该添加这些。