Spring ResponseEntity를 사용하여 HTTP 응답 조작

1. 소개

Spring을 사용하면 일반적으로 HTTP 응답 미세 조정을 포함하여 동일한 목표를 달성 할 수있는 여러 가지 방법이 있습니다.

이 짧은 자습서에서는 ResponseEntity를 사용하여 HTTP 응답의 본문, 상태 및 헤더를 설정하는 방법을 알아 봅니다 .

2. ResponseEntity

ResponseEntity 는 전체 HTTP 응답 (상태 코드, 헤더 및 본문)을 나타 냅니다. 결과적으로이를 사용하여 HTTP 응답을 완전히 구성 할 수 있습니다.

사용하려면 엔드 포인트에서 반환해야합니다. 나머지는 봄이 알아서합니다.

ResponseEntity 는 일반 유형입니다. 결과적으로 모든 유형을 응답 본문으로 사용할 수 있습니다.

@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }

프로그래밍 방식으로 응답 상태를 지정하므로 시나리오마다 다른 상태 코드로 반환 할 수 있습니다.

@GetMapping("/age") ResponseEntity age( @RequestParam("yearOfBirth") int yearOfBirth) { if (isInFuture(yearOfBirth)) { return new ResponseEntity( "Year of birth cannot be in the future", HttpStatus.BAD_REQUEST); } return new ResponseEntity( "Your age is " + calculateAge(yearOfBirth), HttpStatus.OK); }

또한 HTTP 헤더를 설정할 수 있습니다.

@GetMapping("/customHeader") ResponseEntity customHeader() { HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "foo"); return new ResponseEntity( "Custom header set", headers, HttpStatus.OK); }

또한 ResponseEntity는 두 개의 중첩 빌더 인터페이스를 제공 : HeadersBuilder 과 하위 인터페이스 보디를 . 따라서 ResponseEntity 의 정적 메소드를 통해 해당 기능에 액세스 할 수 있습니다 .

가장 간단한 경우는 본문과 HTTP 200 응답 코드가있는 응답입니다.

@GetMapping("/hello") ResponseEntity hello() { return ResponseEntity.ok("Hello World!"); }

가장 많이 사용되는 HTTP 상태 코드의 경우 정적 메서드를 얻습니다.

BodyBuilder accepted(); BodyBuilder badRequest(); BodyBuilder created(java.net.URI location); HeadersBuilder noContent(); HeadersBuilder notFound(); BodyBuilder ok();

또한 BodyBuilder status (HttpStatus status)BodyBuilder status (int status) 메서드를 사용하여 HTTP 상태를 설정할 수 있습니다.

마지막으로 ResponseEntity BodyBuilder.body (T body) 를 사용하여 HTTP 응답 본문을 설정할 수 있습니다.

@GetMapping("/age") ResponseEntity age(@RequestParam("yearOfBirth") int yearOfBirth) { if (isInFuture(yearOfBirth)) { return ResponseEntity.badRequest() .body("Year of birth cannot be in the future"); } return ResponseEntity.status(HttpStatus.OK) .body("Your age is " + calculateAge(yearOfBirth)); }

사용자 정의 헤더를 설정할 수도 있습니다.

@GetMapping("/customHeader") ResponseEntity customHeader() { return ResponseEntity.ok() .header("Custom-Header", "foo") .body("Custom header set"); }

이후 BodyBuilder.body ()가 반환 ResponseEntity 대신 보디를, 그것은 마지막 호출해야합니다.

참고로하는 것이 HeaderBuilder 우리는 응답 본문의 속성을 설정할 수 없습니다.

컨트롤러에서 ResponseEntity 객체를 반환하는 동안 요청을 처리하는 동안 예외 또는 오류가 발생할 수 있으며 다른 유형으로 표시된 사용자에게 오류 관련 정보를 반환하려고합니다 .

Spring 3.2는 이러한 종류의 시나리오를 처리 하는 새로운 @ControllerAdvice 주석 으로 전역 @ExceptionHandler에 대한 지원을 제공합니다 . 자세한 내용은 여기에서 기존 기사를 참조하십시오.

ResponseEntity 는 매우 강력 하지만 과용해서는 안됩니다. 간단한 경우에는 우리의 요구를 충족시키는 다른 옵션이 있으며 훨씬 더 깨끗한 코드가 생성됩니다.

3. 대안

3.1. 안녕하세요.

클래식 Spring MVC 애플리케이션에서 엔드 포인트는 일반적으로 렌더링 된 HTML 페이지를 리턴합니다. 때로는 실제 데이터 만 반환하면됩니다. 예를 들어 AJAX와 함께 엔드 포인트를 사용할 때.

이 경우 요청 처리기 메서드를 @ResponseBody로 표시 할 수 있으며 Spring은 메서드의 결과 값을 HTTP 응답 본문 자체로 처리합니다.

자세한 내용은이 기사를 참조하십시오.

3.2. 안녕하세요.

끝 점이 성공적으로 반환되면 Spring은 HTTP 200 (OK) 응답을 제공합니다. 엔드 포인트에서 예외가 발생하면 Spring은 사용할 HTTP 상태를 알려주는 예외 처리기를 찾습니다.

이러한 메소드를 @ResponseStatus로 표시 할 수 있으므로 Spring 은 사용자 정의 HTTP 상태로 반환합니다 .

더 많은 예를 보려면 사용자 정의 상태 코드에 대한 기사를 방문하십시오.

3.3. 응답을 직접 조작

Spring은 또한 javax.servlet.http.HttpServletResponse 객체에 직접 접근 할 수있게합니다 . 메서드 인수로 선언하기 만하면됩니다.

@GetMapping("/manual") void manual(HttpServletResponse response) throws IOException { response.setHeader("Custom-Header", "foo"); response.setStatus(200); response.getWriter().println("Hello World!"); }

Spring은 기본 구현 위에 추상화와 추가 기능을 제공하므로 이러한 방식으로 응답을 조작해서는 안됩니다 .

4. 결론

이 기사에서 우리는 Spring에서 HTTP 응답을 조작하는 여러 가지 방법에 대해 논의하고 그 장점과 단점을 조사했습니다.

평소처럼 예제는 GitHub에서 사용할 수 있습니다.