-
자바 공휴일 API 연동Web Programming 2023. 7. 21. 20:50728x90반응형
달력 요구사항이 너무 많다..
이제는 공휴일 표시까지 ㅠㅠ 공휴일 표시가 필요한 달력인지도 모르겠는데..
뭐 우선 요청사항이니 공공데이터를 통해서 공휴일 정보 표출하는 것부터 해보자 !!
<%@ page import="java.io.InputStreamReader"%> <%@ page import="java.net.HttpURLConnection"%> <%@ page import="java.net.URL"%> <%@ page import="java.net.URLEncoder"%> <%@ page import="java.io.BufferedReader"%> <%@ page import="java.io.IOException"%> <%@ page import="org.w3c.dom.*"%> <%@ page import="javax.xml.parsers.DocumentBuilderFactory"%> <%@ page import="javax.xml.parsers.DocumentBuilder"%> <% // [in] y : 년 // [in] m : 월 // [out] v[i*2 +0]=휴일날짜(YYYYMMDD), v[i*2 +1]=휴일 명칭 // 반환값 : 에러메시지, null == OK HttpURLConnection con = null; String s = null; // 에러 메시지 try { URL url = new URL( "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo" + "?ServiceKey=서비스키" // 서비스키 + "&solYear=2019" // 연도 + "&solMonth=02" // 월 ); con = (HttpURLConnection)url.openConnection(); con.setRequestProperty("Accept-language", "ko"); /* Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(con.getInputStream()); */ DocumentBuilderFactory dof = DocumentBuilderFactory.newInstance(); // XXE 방지 추가 dof.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dof.setFeature("http://xml.org/sax/features/external-general-entities", false); dof.setFeature("http://xml.org/sax/features/external-parameter-entities", false); dof.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); dof.setXIncludeAware(false); dof.setExpandEntityReferences(false); // XXE 방지 추가 DocumentBuilder db = dof.newDocumentBuilder(); Document doc = db.parse(con.getInputStream()); boolean ok = false; // <resultCode>00</resultCode> 획득 여부 Element e; NodeList ns = doc.getElementsByTagName("header"); if (ns.getLength() > 0) { e = (Element)ns.item(0); if (e.getElementsByTagName("resultCode").item(0).getTextContent().equals("00")) ok = true; // 성공 여부 else // 에러 메시지 s = e.getElementsByTagName("resultMsg").item(0).getTextContent(); } if (ok) { ns = doc.getElementsByTagName("item"); for (int i = 0; i < ns.getLength(); i++) { e = (Element)ns.item(i); /* v.add(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜 v.add(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 */ out.println(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜 out.println(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 } } } catch (Exception e) { s = e.getMessage(); } if (con != null){ con.disconnect(); } %>
표출화면
우선은 문제없이 잘나온다.
적용 자바 버전은 1.7
추가로 XXE 방지도 같이 해줬다.
파라미터 정보
공공데이터 포털
추가로 함수로 변경해서 사용 예시 !!
<%@ page import="java.io.InputStreamReader"%> <%@ page import="java.net.HttpURLConnection"%> <%@ page import="java.net.URL"%> <%@ page import="java.net.URLEncoder"%> <%@ page import="java.io.BufferedReader"%> <%@ page import="java.io.IOException"%> <%@ page import="org.w3c.dom.*"%> <%@ page import="javax.xml.parsers.DocumentBuilderFactory"%> <%@ page import="javax.xml.parsers.DocumentBuilder"%> <%@ page import="java.util.ArrayList"%> <%@ page import="java.net.MalformedURLException"%> <%@ page import="javax.xml.parsers.ParserConfigurationException"%> <%@ page import="org.xml.sax.SAXException"%> public ArrayList<String> getGongHueData(String year, String month){ // [in] y : 년 // [in] m : 월 // [out] v[i*2 +0]=휴일날짜(YYYYMMDD), v[i*2 +1]=휴일 명칭 // 반환값 : 에러메시지, null == OK HttpURLConnection con = null; String gongHueDayErrMsg = null; // 에러 메시지 ArrayList<String> gongHueDayMonList = null; try { URL url = new URL( "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo" + "?ServiceKey=서비스키" // 서비스키 + "&solYear="+year+"" // 연도 + "&solMonth="+month+"" // 월 ); con = (HttpURLConnection)url.openConnection(); con.setRequestProperty("Accept-language", "ko"); DocumentBuilderFactory dof = DocumentBuilderFactory.newInstance(); // XXE 방지 추가 dof.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dof.setFeature("http://xml.org/sax/features/external-general-entities", false); dof.setFeature("http://xml.org/sax/features/external-parameter-entities", false); dof.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); dof.setXIncludeAware(false); dof.setExpandEntityReferences(false); // XXE 방지 추가 DocumentBuilder db = dof.newDocumentBuilder(); Document doc = db.parse(con.getInputStream()); boolean ok = false; // <resultCode>00</resultCode> 획득 여부 Element e; NodeList ns = doc.getElementsByTagName("header"); if (ns.getLength() > 0) { e = (Element)ns.item(0); if (e.getElementsByTagName("resultCode").item(0).getTextContent().equals("00")) ok = true; // 성공 여부 else // 에러 메시지 gongHueDayErrMsg = e.getElementsByTagName("resultMsg").item(0).getTextContent(); } if (ok) { gongHueDayMonList = new ArrayList<>(); ns = doc.getElementsByTagName("item"); for (int i = 0; i < ns.getLength(); i++) { e = (Element)ns.item(i); gongHueDayMonList.add(e.getElementsByTagName("locdate").item(0).getTextContent().toString()); /* v.add(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜 v.add(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 */ /* out.println(i); out.println(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜 out.println(e.getElementsByTagName("locdate").item(0).getTextContent().getClass().getName()); // 타입확인 */ /* out.println(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 */ } }else{ // 에러메세지 로그찍힘 System.out.println("GonghueDay func conecnt API"+gongHueDayErrMsg.toString()+"Error"); } } catch (MalformedURLException e) { System.out.println("GonghueDay func MalformedURL Error"); }catch (NullPointerException e) { System.out.println("GonghueDay func Null Error"); }catch (IOException e) { System.out.println("GonghueDay func IO Error"); }catch (ParserConfigurationException e) { System.out.println("GonghueDay func ParserConfiguration Error"); }catch (SAXException e) { System.out.println("GonghueDay func SAX Error"); } if (con != null){ con.disconnect(); } return gongHueDayMonList; }
728x90반응형'Web Programming' 카테고리의 다른 글
자바스크립트 confirm 문구 줄바꿈 (0) 2023.07.25 오라클 CASE WEHN 간단 예시 (0) 2023.07.21 오라클 DB 세션 KILL 하기 (0) 2023.07.14 오라클 컬럼 추가 삭제 (0) 2023.07.11 오라클 컬럼명 수정 (0) 2023.07.11