API, Server/Client, RESTful API, HTTP, 실습(OpenWeather API, Tweeter API)
'우리 서버에서 원하는 데이터를 가져갈 수 있도록 해주는 열쇠야!'
라고 답변해줬던 기억이 난다. 과연 적절한 정의였을까?기존에 존재하는 프로그램과 어떻게 소통할 수 있는지 알려주는 인터페이스 / 어떤 프로그램을 다룰 수 있는 조작 방법 혹은 메뉴얼과 비슷
이 있다. 컴퓨터 키보드
, TV 리모컨
이 가장 와닿았다. (리모컨 이 버튼을 누르면 뒤에서 어떤 일이 슈루룩 일어나며 그 버튼이 정의된 행동이 일어난다. 이와 비슷하게 코드를 통해 누르면 빽딴에서 슈루룩 돌아가서 원하는 결과를 가져온다!)(Service) Server
, App/Client
다. API Server
라는 것도 있는데, 쉽게 말해 Client
와 Server
사이의 중간다리 역할을 하는 것이다. 서버가 직접 모든 요청을 다 소화할 수 없을 때 사용하는 것으로 난 이해했다.JSON
형식으로 돌려준다고 한다. 물론 꼭 그런 건 아니다. 관습적으로 통용된다고 이해해도 될 것 같다. 받아오는 형식을 직접 정할 수 있도록 해주기도 하는 등 상황에 따라 다른 것으로 생각해도 된다. GET : 특정 리소스를 달라고 할 때에 사용됨.
예시: 페이지 로딩할 때
POST : 클라이언트에서 서버측에 많은 정보를 전달할 때 사용됨.
예시: 회원가입을 할 때에 특정 유저의 정보를 서버에 저장
"CF. GET 도 클라이언트의 정보를 전달하는데도 사용됩니다. POST 는 주로 JSON 과 같이 한줄로 표현되기 힘든 데이터를 전달할 때 사용합니다."
PUT/PATCH : 서버 측의 특정 리소스를 업데이트 할 때 사용. PUT 은 데이터 전부를 바꿀 때, PATCH 는 부분적으로 변경할 때 사용됨.
예시: 사용자 닉넴임 변경
DELETE : 서버 측의 특정 리소스를 삭제할 때 사용.
예시: 유저 탈퇴
status code
를 정리하면 아래와 같다.다음으로 넘어가기 전에 기억해야할 것은
REST API
라는게 등장하게 된다.RESTful API
라고 부른다.OK
에 대한 Status Code를 꼭 딱 200으로 안 해도 된다거나..)오늘은 아래 실습을 해보았다.
- OpenWeather API 키를 발급받고, 원하는 데이터 가져오기.
- 트위터 API 키를 발급받고, 원하는 데이터 가져오기.
(tweepy
사용함.)
풀었던 코드를 그대로 옮겨둔다.
[OpenWeather]
from ast import If
import requests
import json
API_KEY = '00'
def get_city_data(city_name):
"""
현재 날씨를 보고 싶은 도시 이름을 넣으면 해당 데이터를 json 형태로 리턴하기.
"""
url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_KEY}"
data = requests.get(url) #실행하면 이상없을 때 'Response [200]' 응답 넘겨준다.
current_weather = json.loads(data.text) # json parsing
return current_weather
def get_weather_description(json_data):
"""
받아온 json 데이터 중 '날씨'에 대해서 담고 있는 문자열을 리턴하기
"""
weather_description = json_data['weather'][0]['description']
return weather_description
def get_minimum_temp(json_data):
"""
최저 온도를 섭씨(℃) 단위로 리턴하기
"""
temp_min_kelvin = json_data['main']['temp_min']
temp_min = round(temp_min_kelvin - 273.15, 2) # kelvin to celius fomula => C = K - 273.15
return temp_min
[Twetter API]
import tweepy
def connect_api():
"""
tweepy 로 API 를 연결한 'api' 객체를 리턴하기
"""
api_key = '00'
api_key_secret = '00'
access_token = '00'
access_token_secret = '00'
auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
return api
# 참고 - tweeter portal에서 elevated auth로 업그레이드 하였음. Essential이면 접근 안되서 오류 남.
# 지금은 api ver2가 latest version이지만, v1도 지원이 되며, 위 코드는 v1기준 작동 코드인 듯.
def get_tweets(api, username):
"""
'username' 이 주어지면 해당 유저의 트윗들을 가지고 오기
(140 자 이상이어도 모든 내용을 가지고 올 수 있어야 함)
"""
tweets = api.user_timeline(username, tweet_mode = "extended")
return tweets
#참고한 자료 https://exupery-1.tistory.com/203
[도전과제 - 트위터 이어서]
from locale import NOEXPR
import os
from pickle import NONE
import sqlite3
# DB_FILENAME, DB_FILEPATH 변경하지 마세요
DB_FILENAME = "twitter_db.sqlite3"
DB_FILEPATH = os.path.join(os.getcwd(), DB_FILENAME)
def get_cursor(DB_FILEPATH):
"""
데이터베이스와 연결된 커서 객체를 리턴하기
"""
connection = sqlite3.Connection(DB_FILENAME)
cursor = connection.cursor()
return connection, cursor
def init_database(connection, cursor):
"""
기존에 데이터가 있다면 지우고, 주어진 스키마에 따라 데이터베이스 테이블을 생성한다.
"""
#DROP - tables (sqlite에는 DROP DATABASE statement가 없다. 그래서 그냥 하나씩 한다.)
cursor.execute("DROP TABLE IF EXISTS user;")
cursor.execute("DROP TABLE IF EXISTS tweet;")
#CREATE
cursor.execute("""CREATE TABLE user(
id INTEGER NOT NULL,
screen_name VARCHAR,
PRIMARY KEY (id)
);
""")
cursor.execute("""CREATE TABLE tweet(
id INTEGER NOT NULL,
full_text VARCHAR,
user_id INTEGER,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES user (id)
);
""")
# 참고 - 외래키 정책 => ON UPDATE, ON DELETE cascade, no action등 적용 가능
# 메모: one-to-many => 한 명의 user는 여러 tweet을 가질 수 있다. 반대로 여러 명의 유저는 하나의 트윗을 가질 수 없다.
connection.commit();
data = requests.get(’url’)
print(type(data)) #=> requests.models.Esponse
print(type(data.content)) #=> bytes
print(type(data.text)) #=> text