티스토리 뷰
반응형
다른 메소드는 잘되는데 DELETE 메소드 쓸 때만 400 Bad Request 에러가 떨어졌다.
왜 안되는지 열심히 서치해 본 결과, 지금 사용하고 있는 Spring 버전이 3.2인데
DELETE 메소드에 RequestBody를 보내도록 지원해주는 Spring 버전은 4.2 이후라고 한다.
Spring 버전을 업그레이드 하지 않고 사용하는 방법을 찾아봤다.
SimpleClientHttpRequestFactory 구현체를 까보면
저 아래 PUT, POST, PATCH 메소드에만 body를 보내도록 되어 있다.
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
if (this.connectTimeout >= 0) {
connection.setConnectTimeout(this.connectTimeout);
}
if (this.readTimeout >= 0) {
connection.setReadTimeout(this.readTimeout);
}
connection.setDoInput(true);
if ("GET".equals(httpMethod)) {
connection.setInstanceFollowRedirects(true);
} else {
connection.setInstanceFollowRedirects(false);
}
if (!"PUT".equals(httpMethod) && !"POST".equals(httpMethod) && !"PATCH".equals(httpMethod)) {
connection.setDoOutput(false);
} else {
connection.setDoOutput(true);
}
connection.setRequestMethod(httpMethod);
}
SimpleClientHttpRequestFactory 확장해 prepareConnection 메소드만 오버라이딩 해주고
DELETE 메소드도 body를 사용할 수 있도록 해준다.
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import java.io.IOException;
import java.net.HttpURLConnection;
public class SimpleClientHttpRequestWithBodyFactory extends SimpleClientHttpRequestFactory {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
super.prepareConnection(connection, httpMethod);
if ("DELETE".equals(httpMethod)) {
connection.setDoOutput(true);
}
}
}
그런 다음 RestTemplate를 생성할 때 이렇게 사용해주면 된다.
private <R, B> R communication(String path, HttpMethod method, Class<R> responseType, B body) throws Exception {
HttpHeaders headers = new HttpHeaders();
headers.add("accept", "application/json");
headers.add("content-type", "application/json");
RestTemplate rest = new RestTemplate(new SimpleClientHttpRequestWithBodyFactory());
ResponseEntity<R> response = rest.exchange("http://localhost:8080" + path, HttpMethod.DELETE, new HttpEntity<>(body, headers), responseType);
return response.getBody();
}
(참고 : https://jasper-rabbit.github.io/posts/resttemplate-delete-with-payload/, https://dogpaw.tistory.com/4, https://stackoverflow.com/questions/37987040/how-to-send-http-options-request-with-body-using-spring-rest-template)
반응형
'Java' 카테고리의 다른 글
[Java] Spring Boot / Gradle 빌드 시 Execution failed for task ':test'. 에러 해결 (3) | 2022.05.24 |
---|---|
[Java] SchemaManagementException 에러 해결 (0) | 2022.05.11 |
[Java] The processing instruction target matching "[xX][mM][lL]" is not allowed. 에러 해결 (0) | 2022.04.14 |
[Java] Apache Log4j 2 보안 취약점 조치 (0) | 2022.01.04 |
[Java] XML 파싱 라이브러리 JAXB (marshal) (0) | 2021.12.24 |