본문 바로가기

Dev/공공데이터&API연동

API 처음 호출시 반응이 없다면?

728x90
반응형

안녕하세요.

공공데이터 API를 통해서 개발을 하다 보면 종종 API가 동작이 될때가 있고 안될때가 있더라구요.

가끔 네트워크 오류야 그렇다고 하지만. ㅎㅎ

그런 경우 사이트를 서비스하는 시점에서 난감하더라구요

그래서 저는 최소한 API를 3번 정도 호출하게 합니다.

처음에 동작이 안될때를 방지하기 위해서요.

int attempts = 0;
int MAX_RETRIES = 3;
boolean isSuccess = false;
boolean isSuccess = false;
while (attempts < MAX_RETRIES && !isSuccess) {
    try {
        String api_key_des = "api_key를 입력";
        RestTemplate restTemplate = createRestTemplateWithCookies();

        HttpHeaders headers = new HttpHeaders();
        headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
        headers.set("Referer", "https://www.koreaexim.go.kr/");
        headers.set("Accept", "application/json");

        URI uri = UriComponentsBuilder.fromUriString(api_url)
                .queryParam("authkey", api_key_des)
                .queryParam("data", data)
                .queryParam("searchdate", prev_formattedDate)
                .build(true)
                .toUri();
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);

        //System.out.println("getStatusCode : " +response.getStatusCode());
        if(response.getStatusCode() == HttpStatus.OK) {
            System.out.println(response.getBody());
            JSONArray rootJsonArray = new JSONArray(response.getBody());
            if(rootJsonArray !=null && rootJsonArray.length()>0) {
                try {
                     for (int i = 0; i < rootJsonArray.length(); i++) {
                         JSONObject obj = rootJsonArray.getJSONObject(i);
                         KoreaEximExchangeVO temp = new KoreaEximExchangeVO();

                         int result = obj.optInt("result", 0);
                         String cur_unit = obj.optString("cur_unit", "N/A");
                         String cur_nm = obj.optString("cur_nm", "N/A");

                        // 쉼표(,)가 포함된 문자열 값을 숫자로 변환
                         double ttb = obj.has("ttb") && !obj.isNull("ttb") ? Double.parseDouble(obj.optString("ttb", "0.0").replace(",", "")) : 0.0;
                         double tts = obj.has("tts") && !obj.isNull("tts") ? Double.parseDouble(obj.optString("tts", "0.0").replace(",", "")) : 0.0;
                         double deal_bas_r = obj.has("deal_bas_r") && !obj.isNull("deal_bas_r") ? Double.parseDouble(obj.optString("deal_bas_r", "0.0").replace(",", "")) : 0.0;
                         double bkpr = obj.has("bkpr") && !obj.isNull("bkpr") ? Double.parseDouble(obj.optString("bkpr", "0.0").replace(",", "")) : 0.0;

                     }
                     state = true;
                     isSuccess = true;
                     break;
                }catch(Exception e) {
                    e.printStackTrace();
                    rtn_cd = "402";
                    rtn_msg = "처리 중 문제가 발생했습니다.";
                    state = false;
                    attempts++;
                    System.err.println("Request failed. Retrying " + attempts + "/" + MAX_RETRIES);
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException ignored) {}
                }
            }
        }else {
            rtn_cd = response.getStatusCode()+"";
            state = false;
            rtn_msg = "공공데이터 API 처리중 문제가 발생했습니다.("+rtn_cd+")";
            attempts++;
            System.err.println("Request failed. Retrying " + attempts + "/" + MAX_RETRIES);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException ignored) {}
        }
    }catch(Exception e) {
        e.printStackTrace();
        rtn_cd = "500";
        state = false;
        rtn_msg = "처리 중 문제가 발생했습니다.("+rtn_cd+")";
        attempts++;
        System.err.println("Request failed. Retrying " + attempts + "/" + MAX_RETRIES);
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException ignored) {}
    }
}

소스를 보시면 MAX_RETRIES 최대 실행수

attempts 요청수

isSuccess 성공여부 ㅎㅎ

 

위의 소스로 API 호출시 처리를 하니 문제없이 API 호출 화면이 나오더라구요 ㅎㅎ

Tip입니다.

 

저는 한국수출입 은행에서 제공하는 환율 API 호출시 이용한 방법입니다.

https://www.duoduo-info.com/finance/koreaexim/exchange

 

한국수출입은행 환율 조회

한국수출입은행에서 제공하는 환율정보

www.duoduo-info.com

 

 

728x90
반응형