[내일배움캠프] #211006 💻 TIL 💻

이수영·2021년 10월 6일
0

MY TIL 

목록 보기
14/50
post-thumbnail

팀프로젝트

공공데이터 API

우리 팀은 지역별 일몰일출시간 정보를 얻어오기 위해 공공데이터 오픈 API를 사용하였다. 이것을 받아오고 출력하는 과정 전부 내가 담당하였는데 1차 release 때까지 내가 서버를 실행하면 일몰일출api가 실행되지만 우리 팀의 다른팀원들에게는 이 api가 작동을 못하였다. 이것의 문제점이 무엇인가 ... cors 부터 팀원들이 다해보셨다고 했지만 작동을 안하였다 .
오늘 튜터님께 도움을 요청했고 그것은 바로 자바스크립트의 크로스도메인 문제라고 하셨다

크로스도메인이란 ?

크로스도메인은 서로 다른 도메인간의 호출을 뜻하는데 ,
자바스크립트는 동일한 도메인 내에서만 서버요청을 허용한다는 크로스도메인이라는 원칙이 있다. 내가 개발한 웹사이트에서만 사용하기위해 api를 구축하였는데 다른 도메인에서 이 api를 호출하여 사용하면 문제가 되기 때문이다.

따라서 자바스크립트는 Same Origin Policy(동일 출처 정책)을 두어 크로스도메인을 차단한다.

이 개념을 몰랐던 나는 자바스크립트에서 ajax 요청을 통해 공공데이터 api를 가져와서 썼기 때문에 다른 팀원들에게는 실행이 안되어 보여지지 않았던 것이다.

튜터님은 서버에서 이 공공데이터 API를 받아오라는 해결책을 주셨고 나는 서버로 get요청을 보내고 서버에서 다시 공공데이터url로 get요청을 하는 방식으로 코드를 짰다.

#공공데이터 api query url 만드는함수
def get_request_query(url, operation, params, serviceKey):
    import urllib.parse as urlparse
    params = urlparse.urlencode(params)
    request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
    return request_query

@app.route('/time',methods=['GET'])
def show_time():
    URL="http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService"
    OPERATION = 'getLCRiseSetInfo'
    SERVICEKEY="/oZ4AFQEH6WdKfRkiTxU9cNH8VHjxNsZO3PeRFfdDwIQLI3TfmMbjfQvhRSJyrACs3w1ARppFgEkiz5ebTfibg=="


    longitude = request.args.get('long',int)
    latitude = request.args.get('lati',int)
    date = request.args.get('date',int)
    PARAMS={
        'locdate':date,
        'longitude':longitude,
        'latitude':latitude,
        'dnYn':'y'
    }


    #response=requests.get("http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService/getLCRiseSetInfo?&longitude=" + longitude + "&latitude=" + latitude + "&locdate=" + date + "&dnYn=y&ServiceKey=/oZ4AFQEH6WdKfRkiTxU9cNH8VHjxNsZO3PeRFfdDwIQLI3TfmMbjfQvhRSJyrACs3w1ARppFgEkiz5ebTfibg==")
    request_query = get_request_query(URL, OPERATION, PARAMS, SERVICEKEY)

    print('request_query:', request_query)
    response = requests.get(url=request_query)
    return response.text

이렇게 내가 직접 서버에서 구현을 해보니 자신감도 생긴 것 같다 ㅎㅎ .
오늘은 할일을 다 끝냈고 2차 백신까지 맞았기 때문에 이제 쉴꺼다 ㅎㅅㅎ

profile
Hongik Univ 💻

0개의 댓글