본문 바로가기
백엔드/API

[API] Open API를 XML 형식으로 불러와서 JSON으로 변환 (API 결과값에 따라 형태가 달라질 때)

by eyoo 2022. 8. 25.

Open API는 공연 정보를 받아오는 Kopis의 공연 조회 API를 사용했다.

 

참고:

https://kopis.or.kr/por/cs/openapi/openApiList.do?menuId=MNU_00074&tabId=tab1_1 

 

공연예술통합전산망

예술경영지원센터 운영, 공연 예매 정보 집계 및 DB, 예매상황판, 공연통계 등 제공.

kopis.or.kr:443

 

OpenAPI 이용하려면 requests 라이브러리 이용한다.

또, xml을 변환 하려면 xmltodict를 사용한다.

 

pip install requests
pip install xmltodict

 

 

먼저 API키를 발급받아 포스트맨에서 나오는 결과값을 확인하자

 

<?xml version="1.0" encoding="UTF-8"?>
<dbs>
    <db>
        <mt20id>PF196211</mt20id>
        <prfnm>제13회 금호주니어콘서트, 조혜선 호른 독주회</prfnm>
        <prfpdfrom>2022.08.11</prfpdfrom>
        <prfpdto>2022.08.11</prfpdto>
        <fcltynm>유스퀘어 문화관</fcltynm>
        <poster>http://www.kopis.or.kr/upload/pfmPoster/PF_PF196211_220812_134906.png</poster>
        <genrenm>클래식</genrenm>
        <prfstate>공연완료</prfstate>
        <openrun>N</openrun>
    </db>
</dbs>

# xml 형태로 나온다.

 

 

이제 API를 받아올 클래스를 만든다.

 

# 공연 조회
class PerformanceSearchResource(Resource):
    def get(self) :
    return

 

 

그 후 받아올 파라미터를 설정한다.

 

def get(self) :
        # 파라미터로 검색 조건 받기
        # 필수 파라미터
        stdate = request.args['stdate'] # 공연시작일자, 6자로 입력받기 ex) 20220701
        eddate = request.args['eddate'] # 공연종료일자, 6자로 입력받기 ex) 20220801
        cpage = request.args['cpage'] # 현재 페이지, 정수형으로 입력
        rows = request.args['rows'] # 페이지당 목록 수, 정수형으로 입력

        # 선택 파라미터
        shprfnm = request.args['shprfnm'] # 공연명
        shprfnmfct = request.args['shprfnmfct'] # 공연시설명
        shcate = request.args['shcate'] # 장르 코드
        signgucode = request.args['signgucode'] # 지역(시도) 코드
        prfstate = request.args['prfstate'] # 공연 상태 코드

        params = {
            "service" : Config.KOPIS_ACCESS_KEY,
            "stdate" : stdate,
            "eddate" : eddate,
            "cpage" : cpage,
            "rows" : rows,
            "shprfnm" : shprfnm,
            "shprfnmfct" : shprfnmfct,
            "shcate" : shcate,
            "signgucode" : signgucode,
            "prfstate" : prfstate
        }

 

 

이제 요청하는 API의 URL과 API에서 요구하는 데이터 입력한다.

 

response = requests.get(Config.KOPIS_PERFORMANCE_SERARCH_URL, params=params)

 

 

그 후 xmltodict를 사용해서 json형태로 변환한 후 결과값을 나타낸다.

 

        # json 형태로 변환
        xmlToJsonConverter = xmltodict.parse(response.text)

        # json 타입으로 변경
        resultList = json.loads(json.dumps(xmlToJsonConverter))['dbs']['db']
        
        return { "resultList" : resultList }, 200

 

 

클래스를 메인 파이썬 앱에 연결한 후 로컬에서 돌려 포스트맨으로 확인해보자.

 

{
    "resultList": {
        "mt20id": "PF195500",
        "prfnm": "이주희 피아노 독주회",
        "prfpdfrom": "2022.08.01",
        "prfpdto": "2022.08.01",
        "fcltynm": "금호아트홀 연세",
        "poster": "http://www.kopis.or.kr/upload/pfmPoster/PF_PF195500_220801_105228.jpg",
        "genrenm": "클래식",
        "prfstate": "공연완료",
        "openrun": "N"
    }
}

# json 형태로 나오는것을 확인할수 있다.

 

 

json 형태의 결과가 나오는것이 확인 되었으나 단일 값과 2개 이상일때의 값의 형태가 달라진다.

 

단일 값일 때의 형태:

 

{
    "resultList": {
        "mt20id": "PF195500",
        "prfnm": "이주희 피아노 독주회",
        "prfpdfrom": "2022.08.01",
        "prfpdto": "2022.08.01",
        "fcltynm": "금호아트홀 연세",
        "poster": "http://www.kopis.or.kr/upload/pfmPoster/PF_PF195500_220801_105228.jpg",
        "genrenm": "클래식",
        "prfstate": "공연완료",
        "openrun": "N"
    }
}

 

 

2개 이상의 값일 때의 형태:

 

{
    "resultList": [
        {
            "mt20id": "PF195500",
            "prfnm": "이주희 피아노 독주회",
            "prfpdfrom": "2022.08.01",
            "prfpdto": "2022.08.01",
            "fcltynm": "금호아트홀 연세",
            "poster": "http://www.kopis.or.kr/upload/pfmPoster/PF_PF195500_220801_105228.jpg",
            "genrenm": "클래식",
            "prfstate": "공연완료",
            "openrun": "N"
        },
        {
            "mt20id": "PF195453",
            "prfnm": "쇼팽으로 만나는 지브리",
            "prfpdfrom": "2022.07.28",
            "prfpdto": "2022.07.28",
            "fcltynm": "인천동구문화체육센터",
            "poster": "http://www.kopis.or.kr/upload/pfmPoster/PF_PF195453_220729_142606.PNG",
            "genrenm": "클래식",
            "prfstate": "공연완료",
            "openrun": "N"
        }
    ]
}

# 1개일때는 딕셔너리만으로, 두개 이상일때는 딕셔너리가 리스트로 묶여 나온다.

 

 

단일값일때의 딕셔너리 길이를 구한 후 그 길이일때만 리스트로 묶어서 보여주자.

 

        if len(resultList) == 9:
            extra_list = []
            extra_list.append(resultList)
            resultList = extra_list

# 단일값일때의 딕셔너리 길이는 9다.

 

 

이제 형태가 동일하게 나오는것을 확인할수 있다.

 

{
    "resultList": [
        {
            "mt20id": "PF195500",
            "prfnm": "이주희 피아노 독주회",
            "prfpdfrom": "2022.08.01",
            "prfpdto": "2022.08.01",
            "fcltynm": "금호아트홀 연세",
            "poster": "http://www.kopis.or.kr/upload/pfmPoster/PF_PF195500_220801_105228.jpg",
            "genrenm": "클래식",
            "prfstate": "공연완료",
            "openrun": "N"
        }
    ]
}

 

 

 

 

 

 

'백엔드 > API' 카테고리의 다른 글

[API] 포스트맨으로 API명세서 만들기  (0) 2022.08.31
[API] 서비스 배포 전 SQL문 Index 작업  (0) 2022.06.30
[API] 네이버 API 이용하기  (0) 2022.06.27
[API] Rekognition  (0) 2022.06.24
[API] S3로 파일 업로드하는 API  (0) 2022.06.24

댓글