본문 바로가기

Java/Spring

브라우저에서 PUT, DELETE method 요청하기

Restful한 URL을 만들고 API를 작성하기위해 method를 다양하게 사용하려고 노력하고 있을텐데요
Html의 form은 get과 post만 지원하기 때문에 put, delete를 사용하기에 한계가 있습니다.
Spring에서 꼼수(?)를 제공하는데요.
직접 Spring이 제공하는 form을 써서 넘기셔도 되고 jQuery의 ajax를 쓴다면 input hidden을 이용할 수 있습니다.

필터 설정(java)

	@Bean
	public FilterRegistrationBean httpMethodFilter() {
		FilterRegistrationBean filter = new FilterRegistrationBean();
		filter.setFilter(new HiddenHttpMethodFilter());
		filter.setName("httpMethodFilter");
		filter.addUrlPatterns("/*");
		return filter;
	}
- HiddenHttpMethodFilter은 name에 "_method"값이 있으면 Controller에서 method 값으로 구분할 수 있도록 도와줍니다.
- 필터 내부에 아래와 같은 코드가 있습니다.
public static final String DEFAULT_METHOD_PARAM = "_method";

컨트롤러 설정(java)

	@RequestMapping(value = "/foo", method = RequestMethod.DELETE)
	@ResponseBody
	public CarResult delete(Car car) throws Exception {
			
		return carService.delete(car);
	}

화면 설정(html)

input type="hidden" name="_method"

기능 설정(javascript + jquery)

$("input:hidden[name=_method]").val("DELETE");
$.ajax({
	"url" : "/foo",
	"method" : "POST",
	"data" : $("#car").serialize(),
	"dataType" : "json"
})
...
- 실제로 DELETE 요청을 하지 않고 POST로 request를 보내면 서블릿을 거쳐 필터에서 name값인 _method를 보고 DELETE니깐 Controller 중 DELETE로 보내도록 도와줍니다.

'Java > Spring' 카테고리의 다른 글

[Spring] 기본 생성자가 없는 객체 바인딩시키기  (0) 2016.08.30
RestTemplate Encoding  (0) 2016.07.28
[SpringBoot] Address already in use: JVM_Bind  (0) 2016.07.21
Spring Endpoint Health 설정  (0) 2016.07.19
ControllerAdvice  (0) 2016.07.18