API (2)

김주언·2022년 7월 4일
0

WEB - Basic

목록 보기
2/10
post-thumbnail

1. 응답 다루기

1.1 HTTP 코드

우리가 API로부터 받을 수 있는 응답 코드에는 무엇이 있을까요?

코드설명
1xx(정보)요청을 받았으며 프로세스를 계속 진행합니다.
2xx(성공)요청을 성공적으로 받았으며 인식했고 수용하였습니다.
3xx(리다이렉션)요청 완료를 위해 추가 작업 조치가 필요합니다.
4xx(클라이언트 오류)요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
5xx(서버 오류)서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Status
코드 상세 내용 리스트는 위 페이지에서 확인 가능합니다.

그런데 모든 코드와 모든 경우에 대해서 일일히 응답을 작성할 수는 없습니다.

대신에 requests 모듈을 사용하면 됩니다.
requests 모듈은 파이썬 개발자가 API를 다루기 위해 가장 널리 사용되는 방법입니다

그렇다면 현재 코드에서 실제 데이터를 잡기 위해서 우리는 response를 사용하고 JSON 데이터를 받을 겁니다.

import requests 

response = requests.get(url= "http://api.open-notify.org/iss-now.json")
print(response)

data = response.json()
print(data)

이게 실제 데이터고요 이걸 프린트하면 보시다시피 우리가 브라우저에서 받은 것과 완전히 같습니다 코드로 돌아와 보면 여기에 json이 있습니다.

우리는 파이썬 딕셔너리처럼 그걸 똑같이 다룰 수 있습니다 대괄호를 넣고 우리가 관심을 갖는 키의 이름을 입력할 수 있고요

예를 들면만일 이게 파이썬 딕셔너리이고 iss_position을 알고 싶다면 우리는 대괄호를 넣고 iss_position을 넣을 수 있을 겁니다.

import requests 

response = requests.get(url= "http://api.open-notify.org/iss-now.json")
print(response)

data = response.json()["iss_position"]
print(data)

이제 data를 프린트해 보면 범위가 좁혀졌고 위치만 파악해서 우리에게 경도와 위도를 주는 걸 알 수 있습니다

이를 활용해서 아래 코드를 작성해보자

import requests

response = requests.get(url="http://api.open-notify.org/iss-now.json")
data = response.json()

longitude = data["iss_position"]["longitude"]
latitude = data["iss_position"]["latitude"]

iss_position = (longitude, latitude)

print(iss_position)




2. API 매개변수

우리는 API가 어떻게 엔드포인트를 가질 수 있는지 알아보고 그게 우리가 데이터를 얻으려는 곳 또는 교신하려는 곳의 주소에 해당한다고 말했습니다 하지만 API에도 매개변수라는 것이 있습니다.

그건 마치 같은 함수에 다른 입력물을 주어서 다른 결과를 얻는 것처럼, 여러분이 API에 요청을 할 때 여러분이 입력한 입력물에 따라 다른 데이터를 받도록 하는 방법입니다.

다시 은행에 비유해보면, 은행에 가서 개점 시간 같은 그냥 대략적인 질문을 하는 대신에 여러분은 매개변수를 넣을 수도 있을 겁니다. 예를 들면, 월요일에는 몇 시에 문을 닫느냐고 물을 수 있습니다. 또는 화요일에는 몇 시에 문을 닫느냐고 물을 수도 있죠. 이렇게 하면 여러분이 매개변수로서 제공한 입력물에 따라 원하는 특정한 정보를 얻을 수 있습니다.

모든 API에 매개변수가 있는 건 아닙니다. ISS 위치 API처럼 아주 단순한 것도 있고요. 하지만 여러분이 매개변수를 제공할 수 있는 것도 있습니다.

https://sunrise-sunset.org/api

이건 일출 및 일몰 API인데요, 여러분이 어디에 있느냐에 무관하게 일출 시각과 일몰 시각을 제공해줍니다. 여러분의 위치에서 언제 해가 뜨고 질지 알려주려면 물론 여러분의 위치를 제공해야겠죠. 우리는 위도와 경도라는 두 개의 매개변수로 그렇게 할 수 있습니다.

그리고 API 문서에 보시면 아시겠지만, 보통은 여러분이 매개변수를 어떻게 구조화해야 하는지 알려주고 있습니다.

여기 예를 보시면 위도는 lat라는 키를 이용해서 지정할 수 있고 경도는 lng를 이용합니다. 그리고 여러분은 그런 입력물을 부동소수점 숫자로 제공해야 합니다.

보시다시피 일부 매개변수는 필수이고 어떤 매개변수는 선택사항입니다. 마치 우리가 함수를 생성할 때 필수 매개변수와 선택 매개변수가 있는 것처럼 API에서도 마찬가지입니다. 선택 매개변수는 모두 기본값이 있습니다.

예를 들면, 여러분이 제공할 수 있는 date는 향후 또는 과거의 어떤 특정한 날짜의 일출과 일몰을 알고 싶다고 적거나 그냥 비워둘 수도 있습니다. 그러면 기본값이 오늘 날짜가 됩니다.

requests 모듈을 사용해서 일출 시각과 일몰 시각을 얻겠습니다.

import requests

LAT = 35.167736
LNG = 128.997206

params = {
    "lat": LAT,
    "lng": LNG,
    "formatted": 0
}

response = requests.get(url="https://api.sunrise-sunset.org/json", params=params)
print(response.json())

API 기초 실습은 여기까지~!


3. REST API

REST는 Representational State Transfer의 약자로 아키텍처 스타일 중 하나입니다.

시스템에는 데이터와 같은 여러 자원들이 저장되어 있습니다. 이 자원들을 활용하고자하는 여러 응용 프로그램들이 있을 것이고, 따라서 시스템은 이러한 자원들을 필요로 하는 응용 프로그램들에게 줄 수 있어야 합니다.

예를 들어 창고에 물건들이 쌓여있고, 이 중에서 특정한 물건을 찾아서 배송을 해야한다고 할게요. 그러면 어떤 방식으로 창고를 정리해놔야 이후에 물건을 찾기가 편할까요? 당연하게도 그냥 이름을 물건마다 적어놓으면 되겠죠. 택배기사가 배송해야할 물건의 이름을 알고있기만 하다면 그냥 창고에서 꺼내가면 되는것입니다.

이처럼 시스템의 자원을 이름 등으로 구분하여 자원에 대한 여러 정보를 주고 받는 것을 REST라고 합니다.

그렇다면 REST API는 자원을 이름으로 구분해서 표현해놓고, 해당 자원들을 주고 받을 수 있도록 만들어둔 인터페이스라고 정의할 수 있습니다.
간단히 말하자면, 응용 프로그램이 시스템의 자원을 쉽게 사용할 수 있도록 시스템이 각 자원에 이름을 붙여두어서 정리해둔 것이라고 보면 됩니다.

클라이언트가 서비스를 이용하기 위해 어떠한 형식으로 요청을 보내고 응답을 받는지에 대한 것. REST아키텍처를 따라 구현된 서비스를 REST 서비스라고 한다. REST 아키텍처 스타일은 6가지 제약조건이 있고, 이 제약조건을 따르는 API를 RESTful API라고한다.

[6가지 제약조건]
1. 클라이언트 - 서버

2. Stateless

3. Cacheable 데이터

4. 레이어 시스템
- 서버가 인증서버, 캐싱서버, 로드 밸런서를 거쳐 최종적으로 애플리케이션에 도착한다고 가정할 때, 이 사이의 레이어는 응답에 영향을 미치지 않으며 클라이언트는 레이어의 존재 인식하지 못한다.

5. code-on-demand (optional)
- 클라이언트는 서버에 코드를 요청할 수 있고, 서버가 리턴한 코드를 실행할 수 있다.

일관적 인터페이스

그리고 이 REST API는 프론트엔드와 백엔드가 데이터를 주고 받기 위한 아주 대표적인 방법 중 하나입니다.

위 설명 중, 응용 프로그램이 시스템의 자원을 쉽게 사용할 수 있도록 시스템이 각 자원에 이름을 붙여두어서 정리해둔 것이라고 보면 됩니다. 문장에서 응용프로그램이 프론트엔드, 시스템이 백엔드의 역할인거에요.

따라서 백엔드 시스템을 개발한다는 것은 프론트엔드에서 만들어질 응용프로그램이 우리 시스템의 데이터에 접근하고자 하며 해당 접근 요청에 대해 쉽게 데이터를 제공하도록 하는 기능(API)을 잘(RESTful) 만들어줘야 한다는 것입니다.

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글