Spring Boot Rest - Как принять несколько заголовков

Я использую Spring Boot V2.2.2.RELEASE и делаю версионирование API с использованием настраиваемых заголовков. Я разработал такую ​​небольшую конечную точку:

@GetMapping(value = "/student/header", headers = {"X-API-VERSION=2", "X-API-VERSION=1"})
public StudentV1 headerV2() {
    return new StudentV1("Bob Charlie");
} 

Когда я нажимаю curl -X GET http://localhost:8080/student/header -H 'x-api-version: 1', я получаю сообщение об ошибке.

{
    "timestamp": "2020-01-13T09:20:20.087+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/student/header"
}

Если я использовал headers = {"X-API-VERSION=2"}, то он работает, но если я использовал headers = {"X-API-VERSION=2", "X-API-VERSION=1"}, то все перестает работать.

@GetMapping(value = "/student/header", headers = {"X-API-VERSION=2"})
public StudentV1 headerV2() {
  return new StudentV1("Bob Charlie");
}

person Pra_A    schedule 13.01.2020    source источник


Ответы (1)


при использовании headers = {"X-API-VERSION=2", "X-API-VERSION=1"} должны присутствовать оба заголовка.

Попробуйте использовать одно сопоставление для каждого заголовка, а затем перенаправьте в свой сервис impl.

@GetMapping(value = "/student/header", headers = {"X-API-VERSION=1"})
public StudentV1 headerV1() {
    return serviceImpl.headerV1();
}

@GetMapping(value = "/student/header", headers = {"X-API-VERSION=2"})
public StudentV1 headerV2() {
    return serviceImpl.headerV2();
}
person Marc Stroebel    schedule 13.01.2020
comment
вам нужно будет реализовать собственные обработчики ... codeboje.de/spring-mvc- основы сопоставления аргументов - person Marc Stroebel; 13.01.2020
comment
какая версия должна вызываться при наличии обоих заголовков? Или просто добавьте третье сопоставление с заголовками = {X-API-VERSION = 2, X-API-VERSION = 1} - person Marc Stroebel; 13.01.2020
comment
если я передаю версию 1, тогда должна быть вызвана логика, относящаяся к версии 1, и я передаю версию 1, а затем логику, относящуюся к версии 2. Я подозреваю, что мне нужно указать if else на контроллере, который мне плохо выглядит - person Pra_A; 13.01.2020
comment
@Alexander - попробуйте использовать одно сопоставление для каждого заголовка, а затем перенаправьте на общий сервис impl. - Не могли бы вы поделиться кодом? - person Pra_A; 13.01.2020