Як отримати доступ до інформації заголовка HTTP у контролері Spring MVC REST?


154

Я новачок у веб-програмуванні взагалі, особливо на Java, тому я просто дізнався, що таке заголовок та тіло.

Я пишу RESTful послуги за допомогою Spring MVC. Я можу створити прості сервіси за допомогою @RequestMappingсвоїх контролерів. Мені потрібно допомогти зрозуміти, як отримати інформацію заголовка HTTP з запиту, який надходить до мого методу в моєму контролері служби REST. Я хотів би розібрати заголовок і отримати з нього деякі атрибути.

Чи можете ви пояснити, як я берусь щодо отримання цієї інформації?

Відповіді:


264

Коли ви коментуєте параметр за @RequestHeaderдопомогою параметра, він отримує інформацію заголовка. Тож ви можете просто зробити щось подібне:

@RequestHeader("Accept")

щоб отримати Acceptзаголовок.

Отже, з документації :

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                              @RequestHeader("Keep-Alive") long keepAlive)  {

}

Значення Accept-Encodingта Keep-Aliveзаголовок надаються відповідно у параметрах encodingта keepAliveпараметрах.

І ніяких турбот. Ми всі ноуби з чимось.


Дякую. У деяких прикладах коду в компанії, в якій я працюю, я бачу HttpServletRequest як параметр, і на ньому є метод getHeader. Який підхід є кращим?
— Кінський голос

1
Віддайте перевагу абстракціям щодо деталей низького рівня API. Я набагато скоріше, щоб Spring MVC резюмував деталі ServletAPI. Я можу використовувати примітки, щоб витягнути те, що мені потрібно з запиту.
— Відя

6
Зазначимо, ви отримаєте 400 помилкових помилок запиту як відповідь у випадку, якщо запит не буде містити такого заголовка. Більш гнучкий шлях прямий доступ до заголовки запитів , як описано в: stackoverflow.com/a/28209710/1828296
— lospejos

Я думаю, це залежить від того, що ви хочете зробити, але відповідь 400 - це поведінка, яку я майже завжди хотів би в такому випадку.
— Видя

@lospejos, якого можна уникнути, використовуючи такий requiredпрапор, @RequestHeader(name = "Keep-Alive", required = false) long keepAliveякий встановить значення KeepAlive на нуль, якщо воно не передбачено. Також є defaultValueполе для анотації docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…
— Niccolò,

88

Ви можете використовувати @RequestHeaderпримітку з HttpHeadersпараметром методу, щоб отримати доступ до всіх заголовків запиту:

@RequestMapping(value = "/restURL")
public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
    // Use headers to get the information about all the request headers
    long contentLength = headers.getContentLength();
    // ...
    StreamSource source = new StreamSource(new StringReader(body));
    YourObject obj = (YourObject) jaxb2Mashaller.unmarshal(source);
    // ...
}

Що з тілом запиту http? Як отримати доступ до специфіки заголовка? Ви можете мені пояснити, чи HttpHeaders - це карта, до якої потрібен ключ для доступу?
— Кінський голос

HttpHeaders має розпорядження для отримання специфіки заголовка. ви можете вивчити це посилання, щоб отримати детальну інформацію: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
— Debojit Saikia

відредагував мою відповідь, щоб показати, як можна отримати доступ до органу запиту.
— Debojit Saikia

1
Для чого потрібні потокові джерела? Це здається занадто складним. Має бути простіший спосіб, ніж використовувати потоки тощо
— Horse Voice

Тут StringReaderвикористовується для читання вхідного потоку символів. StreamSourceпрацює як власник джерела перетворення у вигляді потоку розмітки XML.
— Debojit Saikia

14

Моє рішення в параметрах заголовка з прикладом user = "test" є:

@RequestMapping(value = "/restURL")
  public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers){

System.out.println(headers.get("user"));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.