Как HTTP-запрос декодируется весной? - PullRequest
0 голосов
/ 26 февраля 2020

Так что мой вопрос - это то, что, как мне кажется, не так часто решается. Мой вопрос прост: как HTTP-сообщение (запрос) декодируется или обрабатывается, когда оно принимается сервером (при условии, что на сервере работает пружина mvc application)?

Чтобы поставить мой вопрос в контекст, скажем, клиент отправляет простое HTTP-сообщение на сервер, где декодируется HTTP-сообщение? В том смысле, что в какой-то момент какой-то лог c или код должен проанализировать HTTP-запрос, чтобы увидеть, что он содержит, у меня вопрос: где происходит это действие? За что отвечает диспетчерский сервлет? отвечает ли контейнер приложения, т.е. tomcat, за разбор / декодирование HTTP-сообщения? Если Spring отвечает за это, укажите, какие классы участвуют в декодировании HTTP-сообщения.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Spring Web MVC работает внутри контейнера сервлета, например Tomcat .

Даже при использовании Spring Boot, когда вам не нужно явно развертывать файл WAR в Tomcat экземпляр установлен на вашем компьютере, есть экземпляр Tomcat (или другой контейнер сервлета, такой как Jetty или Undertow - ну, не совсем контейнеры сервлета, но выполняющий ту же роль), работающий встроенный в ваше приложение Spring Boot.

Роль контейнера сервлетов заключается в реализации Спецификации сервлетов от JEE (сейчас Jakarta EE). Таким образом, именно контейнер сервлета отвечает за прослушивание порта (ов) HTTP (80, 8080, 443 ...), анализ запросов HTTP, которые он получает, и предоставление их верхним уровням через API сервлета.

Аналогично, Servlet API позволяет отправлять ответ клиенту. Он преобразует Java вызовы объектов и методов, которые мы передаем ему, в правильный HTTP-ответ и отправляет его по сети.

API сервлета является относительно низкоуровневым, и его непосредственное использование довольно многословно и утомительно , Вот почему MVC фреймворки, такие как Spring MVC (а до этого Struts и многие другие), а также JSF были построены поверх него.

(Обратите внимание, что не все Java веб-фреймворки являются построен на основе Servlet API. Одним из таких примеров является инфраструктура Play!).

Итак, Spring MVC, в свою очередь, использует Servlet API и строит его, в основном, скрывая, чтобы предоставьте вам, программисту приложения, свой собственный API и предложите вам гораздо больше удобства и функций, таких как

  • , отправляющих запросы вашим контроллерам на основе URL запросов
  • извлечения и синтаксический анализ JSON из тела запроса и представление его вам как Java объекты
  • , помогающие с загрузкой файлов
  • и т. д. *

Теперь, если вы используете реактивные конечные точки ( Spring Web Reactive Framework ), это немного отличается , и Servlet API может быть не задействован напрямую. Но это другая история.

1 голос
/ 27 февраля 2020

Кажется, что Сервлет-диспетчер отвечает за декодирование HTTP-запросов, в частности HttpServlet . Согласно этому источнику (и нескольким другим), похоже, что сервлет-диспетчер имеет несколько подслоев:

enter image description here

Класс HttpServlet - это, как следует из названия, реализация сервлета, ориентированного на HTTP, также определенная в спецификации.

В более практических терминах HttpServlet - это абстрактный класс с реализацией метода service (), который разделяет запросы по типу метода HTTP.

Подробнее о DispatcherServlet:

Что мы действительно хотим сделать как разработчики веб-приложения, так это абстрагироваться от следующего утомительного и стандартного задачи и сосредоточиться на полезных бизнес-логи c:

  • отображение HTTP-запроса на определенный метод обработки
  • парсинг данных и заголовков HTTP-запроса в объекты передачи данных (DTO) или доменные объекты
  • взаимодействие модель-представление-контроллер
  • генерация ответов от DTO, доменных объектов и т. д. c.

T Spring DispatcherServlet обеспечивает именно это.



PS: Отличный вопрос! Некоторое время я использовал Spring, но никогда не подвергал сомнению этот процесс в таких деталях Спасибо, что отправили меня по этому пути:)

...