티스토리 뷰

개발 하던 중 택배추적 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 활용)

Spring RestTemplate

[Spring] 스프링 RestTemplate get방식 :: 마이자몽

[Spring/SpringBoot] RestTemplate으로 HTTP 요청 후 응답받기

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함