Получить заголовки симулировать netflix

Я использую feign netflix для связи с микросервисами.

Таким образом, мой микросервис A имеет операцию «Операция A», которая используется микросервисом B, и он передает один параметр по заголовку с именем X-Total в B.

 MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
 headers.add("X-Total", page.getTotalSize()); 

Мой клиентский интерфейс выглядит следующим образом:

@Headers({
    "Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE
})
@RequestLine("GET Dto/")
List<Dto> search();

static DtoClient connect() {
    return Feign.builder()
        .encoder(new GsonEncoder())
        .decoder(new GsonDecoder())
        .target(ConditionTypeClient.class, Urls.SERVICE_URL.toString());
}

Затем я получаю список dto, но я не знаю, как получить параметр заголовка X-TOTAL:

public List<Dto> search() {
    DtoClient client = DtoClient.connect();
    return client.search();
}

Как получить параметры заголовка?


person Pau    schedule 03.08.2016    source источник


Ответы (2)


Пользовательский декодер

Вы можете использовать собственный декодер:

public class CustomDecoder extends GsonDecoder {

    private Map<String, Collection<String>> headers;

    @Override
    public Object decode(Response response, Type type) throws IOException {
        headers = response.headers();
        return super.decode(response, type);
    }

    public Map<String, Collection<String>> getHeaders() {
        return headers;
    }
}

Вернуть ответ

Другим решением может быть возврат Response вместо List<Dto>:

@Headers({
    "Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE
})
@RequestLine("GET Dto/")
Response search();

Затем десериализуйте тело и получите заголовки:

Response response = Client.search();
response.headers();
Gson gson = new Gson();
gson.fromJson(response.body().asReader(), Dto.class);
person cassiomolin    schedule 03.08.2016
comment
Я использовал ваши предыдущие предложения: измените мой метод search(), чтобы он возвращал Response, а затем получал заголовки и анализировал тело. Работает нормально!! Эта идея тоже хороша, - person Pau; 03.08.2016
comment
@PauChorro В итоге я удалил этот комментарий. Но оба подхода должны работать :) - person cassiomolin; 03.08.2016
comment
Для первого варианта (Пользовательский декодер), как тогда можно получить доступ к методу getHeaders() декодера из кода с помощью фиктивного клиента? - person Hafiz Adewuyi; 09.05.2019

Я опаздываю на вечеринку, но знаю, кому-то в будущем это может помочь

Мы можем обернуть наш response в ResponseEntity<SomePojo>, сделав это, мы можем получить доступ как к объекту headers, так и к body с типом SomePojo.

...
import org.springframework.http.ResponseEntity;
...


public ResponseEntity<List<Dto>> search() {
    DtoClient client = DtoClient.connect();
    return client.search();
}
person kelgwiin    schedule 29.05.2020
comment
Это проще, чем использовать собственный декодер - person jalogar; 21.05.2021
comment
это намного проще. спасибо - person Vishal Patel; 18.07.2021