Як отримати доступ до інформації заголовка 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.