ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RestTemplate Delete Request - RestTemplate Hands On 5
    카테고리 없음 2023. 9. 25. 00:01
    728x90

    개요

    RestTemplate의 GET, POST에 이어 DELETE 메서드를 활용하는 방법에 대해 알아보고자 합니다.

     

    RestTemplate Delete Request의 2가지 방법에 대해 알아봅니다.

    • delete 메서드 활용
    • exchange 메서드 활용

     

    DELETE Method의 특성 하나

    A payload within a DELETE request message has no defined semantics;
    sending a payload body on a DELETE request might cause some existing
    implementations to reject the request.

    HTTP rfc 7231 문서에는 delete 메서드에 body를 담아 전송하는 것은 클라이언트나 서버의 구현에 따라 거부될 수도 있다고 설명합니다.

    (get 요청도 delete 와 동일하게 body가 거부될 수 있습니다.)

     

    RestTemplate Delete 메서드

    // DELETE
    
    @Override
    public void delete(String url, Object... uriVariables) throws RestClientException {
    	execute(url, HttpMethod.DELETE, null, null, uriVariables);
    }
    
    @Override
    public void delete(String url, Map<String, ?> uriVariables) throws RestClientException {
    	execute(url, HttpMethod.DELETE, null, null, uriVariables);
    }
    
    @Override
    public void delete(URI url) throws RestClientException {
    	execute(url, HttpMethod.DELETE, null, null);
    }

    오버로딩 및 오버라이딩된 RestTemplate의 delete 메서드를 살펴보다 보면 request body를 받는 부분이 전혀 없습니다.

    즉, RestTemplate의 delete 메서드 구현에는 body를 허용하지 않도록 구현해 두었습니다.

     

    비교를 위해 postForEntity 메서드를 살펴보겠습니다.

    public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
    Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {

    url, request, responseType, uriVariables가 인자로 있는 차이점을 볼 수 있습니다.

     

    호출 테스트를 위한 코드 준비

    @RestController
    class RestTemplateDeleteRequestTestController {
        val baseUrl = "http://localhost:8080"
    
        @DeleteMapping("delete-test")
        fun deleteTest() {
            val apiPath = "/delete-test-call/{user-id}/subscription-group/{subscription-group}"
            val restTemplate = RestTemplate()
            val userId = "test"
            val subscriptionGroup = "INAPP"
            val responseEntity = restTemplate.delete(
                baseUrl + apiPath,
                userId, subscriptionGroup
            )
            println(responseEntity)
        }
    
        @DeleteMapping("delete-test-call/{user-id}/subscription-group/{subscription-group}")
        fun deleteTestCall(
            @PathVariable("subscription-group") subscriptionGroup: String,
            @PathVariable("user-id") userId: String,
        ) {
            println("delete-Test-Called")
            println(userId)
            println(subscriptionGroup)
        }
    }

    user-id와 subscription-group을 pathVariable로 넘길 수 있습니다.

    이후 responseEntity를 받아 출력해보려고 하면 UNIT으로 빈값이 넘어옵니다.

    즉, delete 메서드는 반환값이 없습니다.

     

    호출 결과

    delete-Test-Called
    test
    INAPP
    kotlin.Unit

     

     

    RestTemplate Exchange 메서드

    delete메서드 대신에 exchange 메서드를 활용하는 방법도 있습니다.

        @DeleteMapping("delete-exchange-test")
        fun deleteExchangeTest() {
            val apiPath = "/delete-exchange-test-call"
            val restTemplate = RestTemplate()
    
    
            val deleteRequest = DeleteRequest()
            val request = HttpEntity(deleteRequest, HttpHeaders())
            val responseEntity = restTemplate.exchange(
                baseUrl + apiPath,
                HttpMethod.DELETE,
                request,
                String::class.java
            )
            println(responseEntity)
    
        }
    
        @DeleteMapping("delete-exchange-test-call")
        fun deleteExchangeTestCall(@RequestBody deleteRequest: _DeleteRequest) {
            println(deleteRequest)
        }

    이렇게 활용한다면 requestBody를 담아서 보낼 수 있습니다.

     

    호출 결과

    //호출받은 쪽 println
    _DeleteRequest(requestEnum=TEST)
    
    //responseEntity println
    <200 OK OK,[Content-Length:"0", Date:"Sun, 03 Sep 2023 00:06:39 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]>

     

     

     

     

    참고자료

    https://velog.io/@ehgks0000/HTTP-GET-DELETE-With-Body

     

    댓글

Designed by Tistory.