Передача HttpServletResponse в методе контроллера Spring Boot - PullRequest
0 голосов
/ 03 ноября 2018

Натолкнулся на фрагмент кода весенней загрузки, который передал HttpServletResponse, имеет аргумент в методе контроллера

public void someApiMethod(@RequestBody MyRequest req, HttpServletResponse response) {
    //some code
    response.setStatus(HttpStatus.NO_CONTENT.value());   
} 

То же самое можно было бы достичь с помощью ResponseEntity, и я чувствую, что здесь нет необходимости передавать HttpServletResponse. Пожалуйста, посоветуйте, какой подход лучше и почему, учитывая, что этот код написан для API остальных?

Ответы [ 4 ]

0 голосов
/ 04 ноября 2018

Spring boot (и в частности Spring MVC, который в данном случае является частью spring boot) обеспечивает абстракцию над HttpResponse низкого уровня, который является частью спецификации сервлета.

В двух словах, эта абстракция избавляет вас от необходимости думать с точки зрения протокола Http и позволяет сосредоточиться на бизнес-логике, что хорошо.

Так что, если вы можете избежать HttpServletResponse - сделайте это всеми средствами (и это то, что вы обычно делаете в своих приложениях). Вы можете создавать объекты (и Spring преобразует их для вас, если его REST), вы можете вернуть ResponseEntity, что означает "status" + "body" - spring сделает все преобразования.

Итак, рассмотрим эти методы в первую очередь.

Теперь иногда вам приходится манипулировать ответом на низком уровне, в данном случае вам нужно работать с объектом HttpServletResponse.

Пример этого, если вы хотите вернуть двоичные данные, которые не могут быть легко преобразованы. Например, если вы хотите подготовить zip-файл и отправить его обратно в результате HTTP-запроса, вам нужно получить более мелкий элемент управления низкого уровня, в этом случае лучше начать с параметра HttpServletResponse передан в метод контроллера.

0 голосов
/ 04 ноября 2018

Лучшее решение - использовать @ResponseStatus, поскольку нет реальной причины добавлять не-API-аргументы, такие как HttpServletResponse или ResponseEntity в методах контроллера. Только переменные пути, параметры запроса, тело запроса и заголовки должны быть набором параметров контроллера для большинства случаев. Кроме того, он более читабелен, удобен в обслуживании и все еще может использоваться Swagger и т. Д.

@ResponseStatus(code = HttpStatus.NO_CONTENT)
public void someApiMethod(@RequestBody MyRequest req) {
    //some code
}
0 голосов
/ 04 ноября 2018

Это зависит от вашего конкретного случая использования.

  • Если вы можете реализовать свой вариант использования без прямого доступа к объекту HttpServletResponse, сделайте это любым способом. Это более чистый подход.
  • Возможно, у вас есть сценарий, в котором вам нужно для доступа к HttpServletResponse. Такой пример может быть, когда вам нужно поток контента обратно на клиент, поэтому вам нужен прямой доступ к потоку вывода ответа. В последних версиях Spring этого также можно достичь с помощью StreamingResponseBody, что исключает необходимость прямого доступа к потоку ответа.
0 голосов
/ 04 ноября 2018

Я полагаю, что это лучший способ вернуть ResponseEntity и использовать его согласно вашему подозрению. ResponseEntity проще в обращении и является более «элегантным» решением, более соответствующим дизайну Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...