DELETE method RequestBody Error.

이상현·2021년 6월 5일
2

차곡차곡

목록 보기
3/8
post-custom-banner

문제

postman으로 API 테스트를 하다 DELETE 요청에 body 데이터가 제대로 전달되지 않는 상황에 마주했다.

환경

  • Tomcat 7.xx
  • Spring MVC
@RequestMapping(value = "delete", method=RequestMethod.DELETE)
public 	@ResponseBody void delete(@RequestParam Map<String, String> formdata,HttpServletRequest request) {
	System.out.println(formdata);
    	logger.info("delete, Post method");

	service.delete(formdata, request);
    }

위와 같이 스프링 컨트롤러를 구성하였을 때, @RequestParam에 해당하는 formdata가 Body에 담겨서 전달이 되야한다고 생각했는데, 전달이 되지 않았다.


그동안
GET 요청시에는 @PathVariable
POST 요청시에는 @RequestParam으로 데이터를 전달했었다.

DELETE/PUT에서는 @RequestParam이 안되는 건가?

문제를 해결하기 위해 HTTP Method 관련된 자료를 찾아보며 몰랐던 것을 배울 수 있었다.

참고한 글들은 아래와 같다.


참고한 자료들

📘 http://blog.leekyoungil.com/?p=390
📘 https://okky.kr/article/393051
📘 http://hwannnn.blogspot.com/2018/07/putdeletemapping-body.html
📘 https://sjh836.tistory.com/142


새로 알게된 내용

  • 문제의 원인
    : HTTP Spec 자체에서 금지하고 있어서 body에 데이터를 전달할 수 없는 것은 아니나, 일반적으로 사용되는 방식이 아님. 때문에 클라이언트, 라이브러리, 미들웨어에서 지원하지 않을 수 있다.

    나의 경우에는 톰캣에서 Delete 메소드 요청시 body를 확인하는 것이 기본설정이 아니어서 문제가 발생하였다.

    일반적인 HTTP 메소드 사용은 아래와 같다.

    GET, DELETE => header에 데이터 포함
    POST, PUT => body에 데이터 포함


해결

특별한 경우가 아니고서는 일반적인 경우를 따르는게 좋다.
또한 보안상의 이유로 DELETE, PUT을 제한하는 경우도 있다.

특별한 이유로 사용하고자 한다면, 톰캣의 설정파일을 수정하는 방법이 있다.

톰캣의 server.xml 에 아래와 같이 parseBodyMethods 부분에 메소드를 명시하면 Body 데이터를 가져올 수 있다.

하지만, 앞서 말했듯이 일반적인 사용이 아니기에 여러 환경에서 호환이 되지 않을 수 있다.
될 수 있다면 header에 데이터를 담고 '@PathVariable'를 사용하는 것이 좋을 것 같다.

profile
'당신을 한 줄로 소개해보세요'를 이 블로그로 대신 해볼까합니다.
post-custom-banner

0개의 댓글