티스토리 뷰
개발 하던 중 택배추적 API를 서버에서 호출하여 처리하는 로직을 구현하게되었습니다.
RestTemplate으로 개발 중 알게된 내용을 정리하여 공유해보겠습니다.
더 좋은 방법이나 이상한 점이 있다면 댓글로 알려주시면 감사하겠습니다.
Examples
- getForEntity()
String baseUrl = "localhost:8088/api/v1/test";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(baseUrl, String.class);
getForEntity를 사용하면 위와같이 ResponseEntity 객체를 return 받을 수 있습니다.
- getForObject()
String baseUrl = "localhost:8088/api/v1/test";
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(baseUrl, String.class);
아래와 같은 응답을 가진 API를 호출해서 객체로 응답받는 법
- response (택배추적 API 응답 중 일부)
{
"result": "Y",
"itemName": "상품이름",
"invoiceNo": "1234567890",
"complete": true,
"trackingDetails": [
{
"time": 1598254908000,
"timeString": "2020-08-24 16:41:48",
"code": null,
"where": "서울",
"kind": "집화처리",
"telno": "000-000-000",
"telno2": "",
"remark": null,
"level": 2,
"manName": "",
"manPic": ""
}
]
}
- DTO 생성
@NoArgsConstructor
@Getter
@Setter
public class TrackingDetailDto {
private String timeString;
private String where;
private String kind;
private String telno;
private int level;
}
@NoArgsConstructor
@Getter
@Setter
public class TrackingInfoDto {
private String result;
private String itemName;
private String invoiceNo;
private String completeYn;
private List<TrackingDetailDto> trackingDetails = new ArrayList<>();
}
필요한 데이터를 받을 DTO를 만든 다음
String baseUrl = "localhost:8088/api/v1/test";
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(baseUrl)
.queryParam("t_key", trackingKey)
.queryParam("t_code", companyId)
.queryParam("t_invoice", trackingNo)
.build(false); // 인코딩 하지않음
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000); // api 호출 타임아웃
factory.setReadTimeout(5000); // api 읽기 타임아웃
RestTemplate template = new RestTemplate(factory);
// 방법 1
ResponseEntity<TrackingInfoDto> response = template.exchange(uriComponents.toUriString(), HttpMethod.GET, new HttpEntity<String>(headers), TrackingInfoDto.class);
// 방법 2
ResponseEntity<TrackingInfoDto> response = template.getForEntity(uriComponents.toUriString(), TrackingInfoDto.class);
// 방법 3
TrackingInfoDto response = template.getForObject(uriComponents.toUriString(), TrackingInfoDto.class);
UriComponents
- QueryParam을 추가하기위해 사용함
- .build(false) : URL 인코딩 여부
- 방법 1 exchange()
- Header 지정
- Http Method.GET 지정
- 방법 2 getForEntity()
- Http Method.GET
- response는
TrackingInfoDto
로 받음
- 방법 3 getForObject()
- Http Method.GET
- header 정보없이 body만
TrackingInfoDto
로 받음
Error Handler
template.setErrorHandler(new DefaultResponseErrorHandler() {
public boolean hasError(ClientHttpResponse response) throws IOException {
HttpStatus code = response.getStatusCode();
if (code == HttpStatus.UNAUTHORIZED) {
throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED);
}
return false;
}
});
RestTemplate를 사용하는 방법을 정리해봤습니다.
많은 분들께 도움이 되었으면 좋겠습니다.
감사합니다.
References
A Guide to the RestTemplate | Baeldung
[Springboot] Resttemplate으로 api호출하기 (ex,영진위 데이터 호출 resttemplate.exchange 활용)
'Dev > Spring' 카테고리의 다른 글
Spring Web Static Resources (0) | 2020.11.11 |
---|---|
Spring boot 프로젝트 만들기 (0) | 2020.10.21 |
Spring boot @Formula사용해서 Count Query 하기 (2) | 2020.07.12 |
Spring Security 적용해보기 (0) | 2020.06.02 |
Spring Security Password Encoder 적용해보기 (0) | 2020.06.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- springsecurity
- Python
- 유사결과
- like절
- 개발
- FastAPI
- @formula
- java11
- 웹서비스
- howtoinstallnginx
- API
- ubuntu
- Security
- 스프링부트
- springboot
- QueryDSL
- 스프링부트 시작하기
- Spring
- JPA
- paawordencoder
- spring web
- 스프링
- boot
- ResourceHttpReqeustHandler
- 스프링시큐리티
- mapstruct
- booleanExpression
- ControllerAdvice
- 자바
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함