개인 프로젝트에서 영화 API를 사용해야 하는 부분이 있다. 유명한 영화 open api로는 네이버 api가 있지만 안타깝게도 내가 필요한 부분을 지원해주지 않아 다른 api를 찾아야 했다.
내가 필요한 기능은 영화 제목, 포스터, 줄거리, 관람 등급, 장르였다. 네이버에서는 관람 등급을 지원해주지 않았다. 그러던 도중 찾게된 것이 KMDb의 OPEN API이다.
https://www.kmdb.or.kr/info/api/apiDetail/6
네이버 api보다 관련 포스팅도 적고, 샘플 코드에 python도 없다. 또, 사용 예시를 4월 1일까지 제출해야 해서 이 포스트를 쓰게 되었다.
먼저, api를 사용하기 위해서는 신청을 해야한다. 휴대폰 인증을 통해 간단하게 회원가입과 로그인을 한 뒤, 인증키를 신청한다. 약 1~2일 사이에 승인이 난다. 나는 미리 신청해두어 현재 승인이 된 상태이다.
승인이 완료되었다면 프로젝트를 시작해 보겠다.
나는 drf_open_api라는 프로젝트를 생성한 뒤, movie라는 app을 만들어 주었다.
검색 창에
http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&ServiceKey=(인증키)&detail=N&query="해리포터와비밀의방"
라고 검색하면
이런 결과가 나온다. 자세히 보면
http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&ServiceKey=(인증키)
여기 까지가 기본 url이다. search_json2로 json으로 값을 받겠다고 하고, ServiceKey에는 발급받은 인증키를 넣는다. 이후로는 여러 요청 값을 &로 연결하면 된다.
&detail=N&query="해리포터와비밀의방"
이 부분은 영화 상세정보는 출력하지 않고, 검색 요청 값이 '해리포터와비밀의방' 이라는 것이다. 이 때, query 값에 공백이 들어가면 제대로 된 결과 값이 나오지 않으니 주의해야 한다.
만약 detail=Y로 바꾼다면
이렇게 정말 상세정보까지 나온다.
➕ API 설명서에 보면 포스터 이미지의 주소가 posterURL이라고 하는데 실제 값에서는 posters로 되어있다.
즉 open api를 이용할 때는 기본 url 주소에 요청 인자를 넣어 요청한다.
이걸 views.py에 짜보겠다.
movie/views.py
import json
import urllib
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
@csrf_exempt
@api_view(['GET'])
def movie_list(request):
url = "http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2" \
"&ServiceKey=인증키"
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if rescode == 200:
response_body = response.read()
dict = json.loads(response_body.decode('utf-8'))
return Response(dict, status=status.HTTP_200_OK)
else:
return Response(rescode, status=status.HTTP_400_BAD_REQUEST)
@csrf_exempt: 인증을 구현하지 않을 것이기 때문에 @csrf_exempt를 사용해준다.
@api_view(['GET']): GET method만 허용한다.
urllib이라는 라이브러리를 사용해 request를 보내고 response를 받는다. 이 때 rescode에 http status code를 받는다. 만약 이 코드가 200이면 성공했다는 뜻이기 때문에 응답을 형식에 맞게 보내준다. 아니면 에러 메시지와 함께 400을 반환한다.
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('movie.urls')),
]
movie/urls.py
urlpatterns = [
path('', views.movie_list),
]
postman을 이용해 http://localhost:8000/ 으로 GET 요청을 보내면
이런 식으로 응답이 온다.
이번 포스트에서 짠 코드는 모든 영화를 반환한다. 다음 포스트에서는 검색 결과만 보여주는 것과 응답에서 필요 없는 정보를 빼는 코드를 짜보겠다.