programing

Spring RESTful 어플리케이션에 ResponseEntity 및 @RestController를 사용하는 경우

telecom 2023. 3. 11. 08:36
반응형

Spring RESTful 어플리케이션에 ResponseEntity@RestController를 사용하는 경우

저는 Spring Framework 4.0.7과 MVC 및 Rest를 함께 사용하고 있습니다.

안심하고 작업할 수 있는 고객:

  • @Controller
  • ResponseEntity<T>

예를 들어 다음과 같습니다.

@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {

(작성만 하는) 방법으로

@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
    logger.info("PersonRestResponseEntityController  - createPerson");
    if(person==null)
        logger.error("person is null!!!");
    else
        logger.info("{}", person.toString());

    personMapRepository.savePerson(person);
    HttpHeaders headers = new HttpHeaders();
    headers.add("1", "uno");
    //http://localhost:8080/spring-utility/person/1
    headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());

    return new ResponseEntity<>(headers, HttpStatus.CREATED);
}

돌려주다

@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
    logger.info("PersonRestResponseEntityController  - getPerson - id: {}", id);
    Person person = personMapRepository.findPerson(id);
    return new ResponseEntity<>(person, HttpStatus.FOUND);
}

정상적으로 동작합니다.

다음 항목에서도 같은 작업을 수행할 수 있습니다.

  • @RestController(은 (동일하다)와 같은 있습니다@Controller+@ResponseBody
  • @ResponseStatus

예를 들어 다음과 같습니다.

@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {

(작성만 하는) 방법으로

@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
    logger.info("PersonRestController  - createPerson");
    if(person==null)
        logger.error("person is null!!!");
    else
        logger.info("{}", person.toString());

    personMapRepository.savePerson(person);
    response.setHeader("1", "uno");

    //http://localhost:8080/spring-utility/person/1
    response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}

돌려주다

@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
    logger.info("PersonRestController  - getPerson - id: {}", id);
    Person person = personMapRepository.findPerson(id);
    return person;
}

질문은 다음과 같습니다.

  1. 확실한 이유 또는 특정 시나리오위해 한 옵션을 다른 옵션보다 의무적으로 사용해야 할 경우
  2. (1)이 중요하지 않은 경우, 어떤 접근방식을 제안하고 그 이유를 제시합니다.

ResponseEntity응답 합니다.상태 코드, 머리글 및 본문 등 모든 항목을 제어할 수 있습니다.

@ResponseBody과 HTTP 응답 본문의 입니다.@ResponseStatus를 선언합니다.

@ResponseStatus츠미야전체 메서드가 표시되므로 핸들러 메서드가 항상 동일하게 동작하는지 확인해야 합니다.그리고 여전히 헤더를 설정할 수 없습니다.필요한 것은,HttpServletResponse.

으로는 ★★★★★★★★★★★★★★★★★」ResponseEntity자, 그럼.

Sotorios Delimanolis에서 답을 완성합니다.

ResponseEntity은 더 의 경우 엔 이런 ResponseEntity모든 컨트롤러에 적용되기 때문에 읽고 이해하는 것이 어렵습니다.

오류(Not Found, Conflict 등)와 같은 특수한 경우를 처리하는 경우 스프링 구성에 를 추가할 수 있습니다.따라서 코드에서는 특정 예외를 발생시킬 뿐입니다.NotFoundException예를 들어, 컨트롤러 코드를 보다 명확하게 하기 위해 핸들러에서 수행할 작업을 결정합니다(HTTP 상태를 404로 설정).

공식 문서에 따르면:@RestController 주석을 사용한 REST 컨트롤러 생성

@RestController는 @ResponseBody와 @Controller를 결합한 고정관념 주석입니다.또한 이는 컨트롤러에게 더 큰 의미를 부여하며 프레임워크의 향후 릴리스에서 추가적인 의미론도 포함할 수 있습니다.

쓰는 게 것 요.@RestController알기 쉽게 하기 위해서입니다만, 이 기능을 조합할 수도 있습니다.ResponseEntity(공식 튜토리얼과 여기 코드, 그리고 그것을 확인하기 위한질문따라).

예를 들어 다음과 같습니다.

@RestController
public class MyController {

    @GetMapping(path = "/test")
    @ResponseStatus(HttpStatus.OK)
    public User test() {
        User user = new User();
        user.setName("Name 1");

        return user;
    }

}

다음과 같습니다.

@RestController
public class MyController {

    @GetMapping(path = "/test")
    public ResponseEntity<User> test() {
        User user = new User();
        user.setName("Name 1");

        HttpHeaders responseHeaders = new HttpHeaders();
        // ...
        return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
    }

}

이렇게 하면ResponseEntity필요할 때만.

갱신하다

다음을 사용할 수 있습니다.

    return ResponseEntity.ok().headers(responseHeaders).body(user);

적절한 REST API에는 다음과 같은 컴포넌트가 대응하고 있어야 합니다.

  1. 상태 코드
  2. 응답 본문
  3. 변경된 리소스의 위치(예를 들어 리소스가 생성된 경우 클라이언트는 해당 위치의 URL을 알고 싶어합니다)

ResponseEntity의 주요 목적은 옵션 3을 제공하는 것이었으며, ResponseEntity 없이 나머지 옵션을 달성할 수 있었습니다.

따라서 리소스 위치를 제공하려면 ResponseEntity를 사용하는 것이 좋습니다.그렇지 않으면 사용하지 않아도 됩니다.

API를 수정하여 언급된 모든 옵션을 제공하는 예를 생각해 보십시오.

// Step 1 - Without any options provided
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public @ResponseBody Spittle spittleById(@PathVariable long id) {
  return spittleRepository.findOne(id);
}

// Step 2- We need to handle exception scenarios, as step 1 only caters happy path.
@ExceptionHandler(SpittleNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public Error spittleNotFound(SpittleNotFoundException e) {
  long spittleId = e.getSpittleId();
  return new Error(4, "Spittle [" + spittleId + "] not found");
}

// Step 3 - Now we will alter the service method, **if you want to provide location**
@RequestMapping(
    method=RequestMethod.POST
    consumes="application/json")
public ResponseEntity<Spittle> saveSpittle(
    @RequestBody Spittle spittle,
    UriComponentsBuilder ucb) {

  Spittle spittle = spittleRepository.save(spittle);
  HttpHeaders headers = new HttpHeaders();
  URI locationUri =
  ucb.path("/spittles/")
      .path(String.valueOf(spittle.getId()))
      .build()
      .toUri();
  headers.setLocation(locationUri);
  ResponseEntity<Spittle> responseEntity =
      new ResponseEntity<Spittle>(
          spittle, headers, HttpStatus.CREATED)
  return responseEntity;
}

// Step4 - If you are not interested to provide the url location, you can omit ResponseEntity and go with
@RequestMapping(
    method=RequestMethod.POST
    consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Spittle saveSpittle(@RequestBody Spittle spittle) {
  return spittleRepository.save(spittle);
}

언급URL : https://stackoverflow.com/questions/26549379/when-use-responseentityt-and-restcontroller-for-spring-restful-applications

반응형