코린이의 기록

[Java] RestTemplate Error : I/O error on PUT [Solved] 본문

JAVA

[Java] RestTemplate Error : I/O error on PUT [Solved]

코린이예요 2018. 12. 14. 18:03
반응형

Spring Framework 환경에서 RestTemplate를 이용하여 REST 기반의 서비스 요청을 테스트하다가 아래와 같은 에러가 자주 발생되었다. 


1
Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server]
cs


 

RestTemplate?

Spring 환경에서 제공하는 SpringTemplate를 이용하여 HTTP Request요청을 간단하게 사용할 수 있다. 나는 RestTemplate class를 사용하여 각 Method별 REST request를 구현하였다. (RestTemplate 사용에 대한 자세한 내용은 맨 아래 Reference link 참고)

1
2
3
4
5
6
7
8
9
org.springframework.web.client.RestTemplate
 
 
Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others. 
 
The RestTemplate offers templates for common scenarios by HTTP method, in addition to the generalized exchange and execute methods that support of less frequent cases. 
 
NOTE: As of 5.0, the non-blocking, reactive org.springframework.web.reactive.client.WebClient offers a modern alternative to the RestTemplate with efficient support for both sync and async, as well as streaming scenarios. The RestTemplate will be deprecated in a future version and will not have major new features added going forward.
 
cs



GET method에서 사용했을때는 잘 작동했었는데 PUT method를 사용할때만 'I/O error on PUT request for "http://~" Invalid HTTP method: PUT;' 에러가 발생하였다. 알고보니 RestTemplate는 PATCH/PUT 메소드를 지원하지 않는다고한다. RestTemplate 상위에는 ClientHttpRequest class가 있다. RestTemplate에서 PATCH나 PUT method를 사용하기 위해서는 HttpComponentsClientHttpRequestFactory class가 필요하다. 이 class를 사용하기 위해 pom.xml 및 gradle 파일에 라이브러리를 추가해준다. 

httpclient mvn repository : https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient


1
2
3
4
5
6
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
cs



수정 전

1
2
3
4
5
6
7
8
9
10
RestTemplate resTmpl = new RestTemplate(); 
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<String> response = resTmpl.exchange(baseUrl, HttpMethod.PUT, entity, String.class);
// check the response, e.g. Location header, Status, and body
response.getHeaders().getLocation();
response.getStatusCode();
String result = response.getBody();
return result;
cs

수정 후 : line 5, 6 추가 

1
2
3
4
5
6
7
8
9
10
11
12
RestTemplate resTmpl = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(headers);
ClientHttpRequestFactory httpRequestFactory =  new HttpComponentsClientHttpRequestFactory();
resTmpl = new RestTemplate(httpRequestFactory);
ResponseEntity<String> response = resTmpl.exchange(baseUrl, HttpMethod.PUT, entity, String.class);
// check the response, e.g. Location header, Status, and body
response.getHeaders().getLocation();
response.getStatusCode();
String result = response.getBody();
return result;
cs


반응형
Comments