일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 통영에어비앤비
- 방이편백육분삼십
- 국가직
- 자바스크립트에러처리
- tomcat7
- 통영여행
- ubuntu자바설치
- 통영예쁜카페
- react
- 서울숲누룽지통닭구이
- 한성대맛집
- 성신여대편백집
- 공무원
- 한남동맛집
- 꼴뚜기회
- gradle
- 방이편백육분삼십성신여대
- 파이썬
- 돈암동맛집
- 영화추천
- 뚝섬역맛집
- JavaScript
- 스페인여행
- 성신여대맛집
- 퇴사후공무원
- springboot
- 성북구맛집
- npm
- ELK
- 통영
- Today
- Total
코린이의 기록
[Java] RestTemplate Error : I/O error on PUT [Solved] 본문
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 |
'JAVA' 카테고리의 다른 글
[java] Install JAVA in Ubuntu (0) | 2019.06.13 |
---|---|
[Java] "jar: command not found" [Solved] (0) | 2019.04.15 |
[Java] Criteria API Subquery Expression (0) | 2019.03.07 |
[java] com.aliyun.openservices.iot.api.exception.IotClientException: client is already connected! (0) | 2019.03.04 |
[Java] Java version 변경 (0) | 2018.05.10 |