在Micronaut的声明式客户端中传递自定义标头

时间:2019-05-24 08:12:58

标签: java http groovy microservices micronaut

我正在尝试对Micronaut项目进行检测,以向其添加分布式跟踪(我知道Micronaut已经支持了该项目,但是我对此有一个非常令人信服的理由)。为此,我需要传递自定义HTTP标头,其中包含需要在微服务之间传递的序列化上下文。

我尝试创建过滤器。但是,过滤器仅在返回控制器的方法之后才运行,这意味着在调用过滤器时上下文已丢失。

这是我要检测的方法:

@Get('/pets')
    Single<List<Pet>> pets() {
        petClient.list()
                .onErrorReturnItem(Collections.emptyList())
    } 

这是客户:

@Client(id = 'pets', path = "/v1/pets")
interface PetClient extends PetOperations < Pet > {

      @Override
      Single <List<Pet>> byVendor(String name)

      @Override
      Maybe < Pet > find(String slug)
  }

我还尝试将@Header参数添加到客户端的方法中,但是当我这样做时,调用将停止工作。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作...

@Client(id = 'pets', path = "/v1/pets")
interface PetClient extends PetOperations < Pet > {

    @Override
    @Header(name="some-header-name", value="some-value")
    Single <List<Pet>> byVendor(String name)

    @Override
    Maybe < Pet > find(String slug)
}

您还可以执行以下操作...

@Client(id = 'pets', path = "/v1/pets")
interface PetClient extends PetOperations < Pet > {

    @Override
    // this will result in a header named "someHeaderName"
    Single <List<Pet>> byVendor(String name, @Header String someHeaderName)

    @Override
    Maybe < Pet > find(String slug)
}

您还可以执行以下操作...

@Client(id = 'pets', path = "/v1/pets")
interface PetClient extends PetOperations < Pet > {

    @Override
    Single <List<Pet>> byVendor(String name, @Header('some-header-name') String someValue)

    @Override
    Maybe < Pet > find(String slug)
}