티스토리 뷰

반응형

 

다른 메소드는 잘되는데 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)

 

 

 

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함