【问题标题】:How do I pass dynamic header values to a Micronaut declarative HTTP client?如何将动态标头值传递给 Micronaut 声明式 HTTP 客户端?
【发布时间】:2021-07-09 18:35:14
【问题描述】:

我想利用 Micronaut 的“声明式 HTTP 客户端”功能。我很难理解如何传递动态标头值,并且想知道这是否可能。考虑以下示例:

package com.example;

import io.micronaut.http.annotation.Header;
import io.micronaut.http.client.annotation.Client;
import java.util.ArrayList;

@Client("${my.api.host}")
@Header(name = "Auth-Header", value = "<This needs to be dynamic>")
public interface MyApiClient {
    public ArrayList<Dog> getDogs();
}

如何使我的标头值动态[非静态]?

【问题讨论】:

    标签: micronaut


    【解决方案1】:

    声明式客户端中的动态标头可以在方法参数级别定义。请看下面的例子:

    @Client("${my.api.host}")
    interface LocalhostClient {
        @Get
        List<String> getDogs(@Header(name = "Authorization") String authorization);
    }
    

    然后您可以使用适当的 Authorization 标头值调用客户端方法,如下所示:

    var dogs = client.getDogs("Bearer some-token");
    

    【讨论】:

    • List&lt;String&gt; getDogs(@Header(name = "Authorization") String authorization); - 在那个特定的例子中,我认为name="Authorization" 是可选的。默认情况下,名称将是参数名称,在本例中为authorization。指定名称的常见用例是当标题名称需要包含连字符时,例如public String someMethodName(@Header("Content-Type") String contentType)
    • 杰夫的评论是正确的,我认为这实际上是一个错误。这让我绊倒了。当Header注解这样使用时,name =注解参数被忽略,而使用方法参数的名称。这可能是个问题。例如,我的参数名称是“auth”,因此当我需要的是“Authorization”时,Micronaut 正在创建一个字面意思为“auth”的标头。这花了我几个小时来调试!我正在使用 Micronaut 3.0.3
    • 更新。基本上,name = value = 在类级别注释与方法参数级别注释上的工作方式不同,这实际上记录在 Header 类的代码 cmets 中。仔细阅读:github.com/micronaut-projects/micronaut-core/blob/3.2.x/http/…
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多