본문으로 바로가기

구현 내용

Open API 에 Request 보내서 필요한 정보를 Response 받기.

xml문서에서 필요한 내용만 추출하여 dto 담아 전달하기

 

API 문서 살펴보기

OPEN API를 어떻게 사용하는지 문서를 살펴본다.

 

 

 

 

 

1. 인증 방법은 서비스 KEY를 발급받아 사용자 인증을 받으면 된다.

 

2. REST 방식으로 요청 해야함.

 

3. 메시지 교환 유형은 Request-Response

 

4. 응답 메시지는 XML type으로 들어온다.

(JSON으로 들어 왔으면 훨씬 좋았을 텐데 아쉬운 부분.)

 

 

 

 

 

 

 

 

 

 

 

 

요청에 대한 응답 예시

 

XML type으로 들어 있는 정보를 그대로 쓸 수 없으니 필요한 정보만 추출 해보자

 

핵심코드

sevice 단에서 요청코드를 그대로 작성할 수 있었지만 너무 지저분 해보여 XmlParsing Class를 따로 만들어서 

그 안에 stiatic 메소드로 요청 및 추출하는 코드를 작성함.

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
    public static ApiDto getData(int seq) {
        
        ApiDto dto=new ApiDto();
        
        try{
            String url = "http://www.culture.go.kr/openapi/rest/publicperformancedisplays/d/"
                    + "?ServiceKey=ePfX3pu9m%2BajEWgHGiwfbd%2BNSNIpVJ58g9N%2Fp%2B%2F996n%2FnwagNeyc52WUEYYlE34jKS00Eg3EOlVVVu4g0OTkSQ%3D%3D"
                    + "&seq="+seq;
            
            DocumentBuilderFactory dbFactoty = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactoty.newDocumentBuilder();
            //Parse the content of the given URI as an XML documentand return a new DOM Document object. 
            Document doc = dBuilder.parse(url);
            
            // DOM Tree가 XML 문서의 구조대로 완성될 수 있게 한다.
            doc.getDocumentElement().normalize();
            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
            
            // 파싱할 tag
            NodeList nList = doc.getElementsByTagName("perforInfo");
            System.out.println("파싱할 리스트 수 : "+ nList.getLength());
            
            
            for(int temp = 0; temp < nList.getLength(); temp++){
                Node nNode = nList.item(temp);
                if(nNode.getNodeType() == Node.ELEMENT_NODE){
                    
                    Element eElement = (Element)nNode;
                    
                    dto.setSeq(Integer.parseInt(getTagValue("seq", eElement)));
                    dto.setTitle(getTagValue("title", eElement));
                    dto.setStartDate(getTagValue("startDate", eElement));
                    dto.setEndDate(getTagValue("endDate", eElement));
                    dto.setPlace(getTagValue("place", eElement));
                    dto.setRealmName(getTagValue("realmName", eElement));
                    dto.setArea(getTagValue("area", eElement));
                    dto.setSubTitle(getTagValue("subTitle", eElement));
                    dto.setPrice(getTagValue("price", eElement));
                    dto.setContents1(getTagValue("contents1", eElement));
                    dto.setContents2(getTagValue("contents2", eElement));
                    dto.setUrl(getTagValue("url", eElement));
                    dto.setPhone(getTagValue("phone", eElement));
                    dto.setGpsX(getTagValue("gpsX", eElement));
                    dto.setGpsY(getTagValue("gpsY", eElement));
                    dto.setImgUrl(getTagValue("imgUrl", eElement));
                    dto.setPlaceUrl(getTagValue("placeUrl", eElement));
                    dto.setPlaceAddr(getTagValue("placeAddr", eElement));
                    dto.setPlaceSeq(getTagValue("placeSeq", eElement));
                    
                }    // for end
            }    // if end
                
        
        } catch (Exception e){    
            e.printStackTrace();
        }    // try~catch end
        
        return dto;
        
    } //getData method end
cs

10행-13행 : Url를 xml 문서로 파싱하여 DOM document Object로 리턴한다.

16행 : DOM document Object가 xml 문서의 구조 대로 완성될 수 있게 한다.

20행 : "perforInfo"의 노드를 모두 찾아 배열로 돌려준다.

24행-50행 : 배열에 있는 노드들 중 getNodeType() 메소드를 사용하여 노드 종류를 판정한다. 노드 종류가 Element인 경우 getTagValue() 메소드를 사용해 해당 Element의 Text를 가져와 dto에 담는다.

(노드 종류에는 대표적으로 요소(Element), 텍스트(Text)가 있습니다.)

 

1
2
3
4
5
6
7
8
9
    // tag값의 정보를 가져오는 메소드
    public static String getTagValue(String tag, Element eElement) {
        NodeList nlList =  eElement.getElementsByTagName(tag).item(0).getChildNodes();
        Node nValue = (Node) nlList.item(0);
        if(nValue == null) {
            return null;
        }    
        return nValue.getNodeValue();
    }
cs

getData() 메소드와 중복되는 메소드들이 어서 설명 생략