공공데이터 포털의 오픈API 활용해 XML / JSON 형식의 데이터를 Jquery의 ajax를 활용하여 파싱해 데이터를 가져오는 작업을 해보겠습니다.


1. https://www.data.go.kr/ 접속 OPEN API 클릭



2.  저는 활용신청 건순이 가장 많은 국내 관광정보 서비스를 쓰려고 합니다.




3. 국내 관광정보 서비스 오픈 API를 신청하고 인증키를 받습니다. 


참고문서에 TourAPI_Guide.zip 파일을 다운받습니다.


zip 파일 안에는 API활용메뉴얼이 있고 자신이 필요한 데이터를 호출하면 됩니다.


저는 행사/공연/축제 에 대한 정보를 받아오려고 합니다.


형식의 http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?ServiceKey=자신의키값&Request Parameter 항목명=값

형태로 요청하면 됩니다.

Request Parameter 에 필수 항목은 꼭 들어가야하는 파라미터항목입니다.







4. 자료실에 공유서비스 활용자 클라이언트 가이드 문서 등 여러 개발에 필요한 문서를 찾아 다운로드합니다.


5. 저는 웹서비스를 호출하는 방식으로 REST방식을 선택하겠습니다.


또한 서블릿과 자바스크립트를 이용해 XML과 JSON 형태의 데이터를 jquery의 ajax를 이용 파싱해 가져오려고 합니다.


6. 먼저 이클립스로 새 프로젝트 생성 후,  서블릿 파일 PublicData.java 생성, index.jsp 생성, 간단히 테스트 해보겠습니다.




7. index.jsp 안 스크립트 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script>
 
      $.ajax({          
            url: 'PublicData.do',
            type: 'get',
            dataType: 'json',
            success: function(msg){
                console.log(msg.response.body.items.item);
                var myItem = msg.response.body.items.item;
                
                for(var i=0; myItem.length; i++){
                    var output = '';
                    console.log(myItem.length);
                    output += '<h3>'+ i + '번째 서울 축제 데이터' +'</h3>';
                    output += '<h4>'+myItem[i].addr1+'</h4>';
                    output += '<h4>'+myItem[i].title+'</h4>';
                    output += '<h4>'+myItem[i].tel+'</h4>';
                     document.body.innerHTML += output;
                }
            }
        });    
 
</script>
 
cs



8. PublicData.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URL;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
import org.json.simple.JSONObject;
 
/**
 * Servlet implementation class test
 */
@WebServlet("/PublicData.do")
public class PublicData extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PublicData() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        String addr = "http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?ServiceKey=";
        String serviceKey = "자신의 키값 입력";
        String parameter = "";
//        serviceKey = URLEncoder.encode(serviceKey,"utf-8");
        PrintWriter out = response.getWriter();
        parameter = parameter + "&" + "areaCode=1";
        parameter = parameter + "&" + "eventStartDate=20170401";
        parameter = parameter + "&" + "eventEndDate=20171231";
        parameter = parameter + "&" + "pageNo=1&numOfRows=10";
        parameter = parameter + "&" + "MobileOS=ETC";
        parameter = parameter + "&" + "MobileApp=aa";
        parameter = parameter + "&" + "_type=json";
        
        
        addr = addr + serviceKey + parameter;
        URL url = new URL(addr);
        
        InputStream in = url.openStream(); 
        CachedOutputStream bos = new CachedOutputStream();
        IOUtils.copy(in, bos);
        in.close();
        bos.close();
        
//        out.println(addr);
        
        String data = bos.getOut().toString();        
        out.println(data);
        
        JSONObject json = new JSONObject();
        json.put("data", data);
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        String addr = "http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?ServiceKey=";
        String serviceKey = "429e9l%2BRPBvvMYSqI0TIu0JgvFl1vio2dcUfXj7d66%2F%2B2glco1EDs1HDHJBssw9U7HAt1A11Cy6N0Hbk2INDfQ%3D%3D";
        String parameter = "";
//        serviceKey = URLEncoder.encode(serviceKey,"utf-8");
        PrintWriter out = response.getWriter();
        parameter = parameter + "&" + "areaCode=1";
        parameter = parameter + "&" + "eventStartDate=20170401";
        parameter = parameter + "&" + "eventEndDate=20171231";
        parameter = parameter + "&" + "pageNo=1&numOfRows=10";
        parameter = parameter + "&" + "MobileOS=ETC";
        parameter = parameter + "&" + "MobileApp=aa";
        parameter = parameter + "&" + "_type=json";
        
        
        addr = addr + serviceKey + parameter;
        URL url = new URL(addr);
        
        InputStream in = url.openStream(); 
        CachedOutputStream bos = new CachedOutputStream();
        IOUtils.copy(in, bos);
        in.close();
        bos.close();
        
//        out.println(addr);
        
        String data = bos.getOut().toString();        
        out.println(data);
        
        JSONObject json = new JSONObject();
        json.put("data", data);
        
    }
}
cs


서블릿인 PublicData.java 코드를 보면 요청할 api주소

http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?

URI 다음에 발급받은 자신의 고유한 서비스 키값과 필요한 파라미터 값을 &로 붙여 주소를 만들고 있습니다. 



http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?ServiceKey=키값&areaCode=1&eventStartDate=20170401&eventEndDate=20171231&pageNo=1&numOfRows=10 ... 생략


요청 파라미터값은 api doc에 자세히 나와있으니 자신이 필요한 요청값을 서비스키값 뒤로 적절히 붙여 요청하면 됩니다.



9. 요청한 주소를 브라우저를 통해 들어가면 xml형식 or json형식의 데이터 포맷으로 나타나게 됩니다.



10. 저는 20170401 ~ 20171231 까지 서울에서 실시하는 축제 정보의 주소, 제목, 전화번호의 키 밸류 형식의 JSON 데이터를 파싱해 가져온 결과입니다.




11. pom.xml 에서 받아온 메이븐 저장소파일 목록입니다.






12. 마지막으로 소스 추가합니다.


첨부파일 :


public_171213.zip


17년 12월 13일 기준으로 최신소스 등록하였습니다.

+ Recent posts