ν€μλ : API, RESTful API
API(Application Programming Interface)
νλ‘κ·Έλ¨λ€μ΄ μλ‘ μν΅ν μ μλ μΈν°νμ΄μ€
νλ‘κ·Έλ¨μ λ€λ£° μ μλ μ‘°μ λ°©λ² νΉμ λ©λ΄μΌ
- μμμ μ λ€μ΄κ°λ€.
- λ©λ΄λ₯Ό λ³΄κ³ μ£Όλ¬Έμ νλ€.
- μ£Όλ°©μ μ£Όλ¬Έ λ΄μ©μ μ λ¬νλ€.
- μ£Όλ¬Έλ μμμ λ§λ λ€.
- μμ±λ μμμ μλμκ² λλ¦°λ€.
ν΄λΌμ΄μΈνΈ : μμμ μμ λκ°λ₯Ό μμ²νλ 'μλ'
λ©λ΄ν : API(μ¬μ μ μ½μλ κ·μΉλ€κ³Ό μ μ°¨)
(API)μλ² : μ¨μ΄ν°(μμμ μ£Όλ¬Ένλ©΄ μμμ μ λ¬ν΄μ£Όλ μν )
(Service)μλ² : μ리μ¬(μ€μ§μ μΌλ‘ μμ²μ μ²λ¦¬νλ μν )
λ©λ΄νμ λ¨μ§ λ¬ΈμμΈ κ²μ²λΌ API μμ μ€μ²΄κ° μλ€.
μμμ λ°μμΌ κ·Έ μμμ μ€μ λ΄μ©μ νμΈν μ μλ―μ΄, API μμ κ²°κ³Ό νΉμ Return Value λ₯Ό λ°μμΌ μ€μ²΄λ₯Ό νμΈν μ μμ΅λλ€.
λ, μλμ΄ νλ²κ±°λ₯Ό μ£Όλ¬Ένλλ° νΌν΄μ λΉΌλ¬λΌκ³ μμ²μ νκ² λλ©΄ μ¨μ΄ν°κ° μ§μ νΌν΄μ λΉΌμ£Όμ§ μμ΅λλ€. μ£Όλ°©μμ μ리λ₯Ό μ μν λ μ΄λ¬ν λΆλΆμ μ²λ¦¬νκ² λ©λλ€. μ΄μ²λΌ κ²°κ΅μλ ν΄λΌμ΄μΈνΈμ μμ²μ μλ²μμ μλ΅ν΄μΌ ν©λλ€.
API μμ : μ€ν API, 곡곡λ°μ΄ν° API, ꡬκΈ/μΉ΄μΉ΄μ€ API λ± (μ ννλ μ λΆ WEB API)
λν, Pythonμ pandas, scikitlearn λ± λ APIλ‘ λ³Ό μ μμ΅λλ€.
APIλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό λ°μμμ λ λ°μ΄ν°μ νμμ 무μμΌκΉ?
μ ν΄μ§ νμμ μμΌλ, λ³΄ν΅ μ νκ² λ μ μλ μλ΅μ λλΆλΆλΆ JSON
νμ
JSON(JavaScript Object Notation)
- μλ°μ€ν¬λ¦½νΈμμ 'Object'λ₯Ό νκΈ°νλ λ°©μ
- νμ΄μ¬μ 'Dictionary'μ κ΅μ₯ν μ μ¬ν©λλ€.
- νμ΄μ¬μ Dictionaryμ²λΌ ν€(Key)μ κ°(Value)λ‘ λ¬Άμ¬μ Έ μλ ꡬ쑰
JSONμ μμ
{
"glossary":{
"title":"example glossary",
"GlossDiv":{
"title":"S",
"GlossList":{
"GlossEntry":{
"ID":"SGML",
"SortAs":"SGML",
"GlossTerm":"Standard Generalized Markup Language",
"Acronym":"SGML",
"Abbrev":"ISO 8879:1986",
"GlossDef":{
"para":"A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso":[
"GML",
"XML"
]
},
"GlossSee":"markup"
}
}
}
}
}
HTTP(HyperText Transfer Protocol ; νμ΄νΌν μ€νΈ ν΅μ κ·μ½) API
νλμ μ»΄ν¨ν°κ° λ€λ₯Έ μ»΄ν¨ν°μ μν΅μ νκ³ μΆμ λ(νμΌμ λ°κ±°λ, μ λ¬νκ±°λ λ±) μ ν΄μ§ κ·μΉκ³Ό νμ μ€μν΄μΌ μνν μν΅μ΄ κ°λ₯ν©λλ€.
μ΄λ κ² μ ν΄μ§ κ·μΉλ€μ νλμ κ·μ½(Protocol)μ΄λΌκ³ ν©λλ€.
μ΄ λ, HTTPλ 'μΉμμ ν΅μ ν λ μ¬μ©λλ κ·μ½' μ
λλ€.
HTTPλ ν¬κ² μμ²(Request) κ³Ό μλ΅(Response) μΌλ‘ λλμ΄μ Έ μμ΅λλ€.
HTTP Request(μμ²)
μμ²νλ μ»΄ν¨ν°κ° ν΄λΌμ΄μΈνΈ, μμ²μ λ°λ μ»΄ν¨ν°κ° μλ²κ° λ©λλ€.
CRUD(CREATE, READ, UPDATE, DELETE)
HTTP λ©μλμ κ²½μ°,
- POST(CREATE) : μλ² μΈ‘μ νΉμ 리μμ€λ₯Ό μ μ₯ν λ μ¬μ© ex) νμκ°μ ν λ νΉμ μ μ μ μ 보λ₯Ό μλ²μ μ μ₯
- GET(READ) : νΉμ 리μμ€λ₯Ό λ¬λΌκ³ ν λ μ¬μ© ex) νμ΄μ§ λ‘λ©ν λ
- PUT/PATCH(UPDATE) : μλ² μΈ‘μ νΉμ 리μλ₯΄λ₯Ό μ
λ°μ΄νΈν λ μ¬μ©, PUT-λ°μ΄ν° μ λΆ λ³κ²½ν λ, PATCH-λΆλΆμ μΌλ‘ λ³κ²½ν λ
ex) μ¬μ©μλλ€μ λ³κ²½ - DELETE(DELETE) : μλ² μΈ‘μ νΉμ 리μμ€λ₯Ό μμ ν λ ex) μ μ νν΄
APIλ₯Ό μ μν λμλ λ³΄ν΅ REST κ°μ΄λλΌμΈμ λ°λ₯΄κ² λκ³ μ΄ λ HTTP λ©μλλ€μ΄ μ¬μ©λ©λλ€.
νμ¬λ μ΄λ¬ν REST ꡬ쑰λ₯Ό λλΆλΆ λ°λ₯΄κ³ μμ΄ μκ³ μμΌλ©΄ νΈν©λλ€.
κΈ°λ³Έμ μΈ APIλ₯Ό μ΄ν΄νκΈ° μν΄ CRUDμ ν΄λΉνλ μμ 4κ°λ μκ³ μμ΄μΌ ν©λλ€.
HTTP Response(λ°μ)
HTTP κ·μ½μ ν΅ν΄μ λ³΄λΈ μμ²μ λν λ°μ λν κ·μ½μ λ°λ₯Έ μλ΅μΌλ‘ λμμ΅λλ€.
STATUS CODE
- 100 λ²λ : μ 보 μλ΅
- 200 λ²λ : μ±κ³΅ μλ΅
- 300 λ²λ : 리λ€μ΄λ μ λ©μμ§(λ€λ₯Έ λ°©λ²μ μ μνλ λ©μμ§)
- 400 λ²λ : ν΄λΌμ΄μΈνΈ μλ¬ μλ΅
- 500 λ²λ : μλ² μλ¬ μλ΅
HTTP μμ
μΉ νμ΄μ§λ₯Ό μ΄μ΄μ κ°λ°μ λꡬλ₯Ό μ° λ€μ λ€νΈμν¬ νμΌλ‘ λ€μ΄κ°λ©΄ μ€μ λ‘ λ³΄λ΄μ§λ HTTP μμ²κ³Ό μλ΅μ λ³Ό μ μμ΅λλ€.
- 'Request Method': μ΄μ μ λ΄€λ HTTP μμ² λ©μλ μ€ GET, 리μμ€λ₯Ό κ°μ Έμ¨λ€λ λ»μΈ λ©μλλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
- 'Status Code' : 200 μ΄λΌλ μ«μ μμ μ΄λ‘μ λΆμ΄ λ€μ΄μμ΅λλ€. 200 μ 'OK', μ±κ³΅νλ€λ λ»μ λλ€. μ¬κΈ°μμλ GET μμ²μ΄ μ±κ³΅μ μ΄μλ€λ λ»μ΄ λ©λλ€.
- 'Request URL' : λκ° μμ²μ νκ³ μλμ§λ₯Ό λ΄κ³ μμ΅λλ€.
- 'Remote Address' : μ΄λ 리λͺ¨νΈ μλ²μ μμ²μ νκ³ μλμ§ μλ €μ£Όκ³ μμ΅λλ€. νμ¬λ 157.245.183.96 μ 443 ν¬νΈμ μμ²μ 보λ΄κ³ μμ΅λλ€.
- 'Referrer Policy' : μμ²μ 보λ΄λ κ³³μ΄ λΉμ¬μμΈμ§, ν μΉμ¬μ΄νΈμμ μ°κ²°λ κ±΄μ§ λ± μλ €μ€λλ€. νμ¬λ 'no-referrer' λ‘ ν μΉμ¬μ΄νΈμμ 보λ΄κ³ μμ΅λλ€.
REST(REpresentational State of Transfer) API
μννΈμ¨μ΄μ μν€ν μ³λ₯Ό μ΄λ»κ² νμ±ν μ§μ λν κ°μ΄λλΌμΈμΌλ‘ μ΄ 6κ°κ° μ‘΄μ¬νλ©° λ€ λ°λ₯΄κ² λλ€λ©΄ ν΄λΉ μν€ν μ³λ₯Ό RESTful μ΄λΌ ν©λλ€.
λ§μ°¬κ°μ§λ‘ WEB APIκ° RESTμ κ°μ΄λλΌμΈλ€μ λ€ λ°λ₯΄λ©΄ RESTful API λΌκ³ λΆλ₯Ό μ μμ΅λλ€.
RESTλΌλ κ²μ νλμ κ°μ΄λλΌμΈμ΄κ³ μ΄λ₯Ό λ°λ₯΄κΈ° μμνλ©΄ REST APIμ΄λ©° 6κ°μ λͺ¨λ κ°μ΄λλΌμΈμ μ§ν€λ©΄ RESTful APIλΌκ³ ν μ μμ΅λλ€.
κΈ°νμ : "κ°λ°μλ, API κ°λ°ν λ, REST κΈ°λ°μΌλ‘ λ§λ€μ΄μ£ΌμΈμ"
κ°λ°μ : "κ°λ°μ νμν μκ°μ΄ λΆμ‘±νκ³ νμλ₯Ό λͺ»λκ»΄μ, RESTfulν API λ‘ λ§λ€μ§ μμλ λ κΉμ?"
κΈ°νμ : "λ€, μ’μ΅λλ€ REST κ°μ΄λλΌμΈμ λ§κ² APIλ₯Ό νΈμΆν μ μλλ‘ κ°λ°ν΄μ£ΌμΈμ"
HTTP APIλ μ¬λλ€μ΄ μ§ν€μ§ μμ ν λ°μ¬κ° μ’λ μ격ν κ·μ μ λ§λ κ²μ΄ REST API μ λλ€.
REST API νμ© μμ(1)-REQUEST-GET )
GET μμ²μ REST μμ μ 보λ 리μμ€λ₯Ό κ°μ§κ³ μ¬ λλ§ μ¬μ©νλΌκ³ μ μλ©λλ€.(μ¦, μλ²μ κΈ°λ‘λ λ°μ΄ν°λ 리μμ€λ₯Ό λ³κ²½ν λ μ¬μ©ν΄μλ μλλ€λ λ»)
- HTTP GET http://www.appdomain.com/users
- HTTP GET http://www.appdomain.com/users?size=20&page=5
- HTTP GET http://www.appdomain.com/users/123
- HTTP GET http://www.appdomain.com/users/123/address
1λ² κ°μ κ²½μ°μλ /users λ‘ λλκ³ μλ²μ κΈ°λ‘λ μ μ λ€μ κ°μ Έμ¬ κ±°λΌκ³ μμν μ μμ΅λλ€.
2λ² κ°μ κ²½μ°μλ λ§μ°¬κ°μ§λ‘ μ μ λ₯Ό κ°μ§κ³ μ€μ§λ§ μΆκ° 쿼리 νλΌλ―Έν° (? λ€μ μ€λ νλͺ©λ€)λ₯Ό ν΅ν΄ νμ΄μ§μ κ°μλ₯Ό μ ν΄μ£Όκ³ μμ΅λλ€.
3λ² κ°μ κ²½μ°μλ μ μ λ₯Ό κ°μ§κ³ μ€μ§λ§ μ μ λͺ©λ‘ μ€μμ 123 μ μΌμΉνλ μ μ λ₯Ό κ°μ§κ³ μ¬ κ±°λΌλ μμμ ν μ μμ΅λλ€.
4λ² κ°μ κ²½μ°μλ 3λ²μ μ μ μ 보μμ address μ λ³΄λ§ κ°μ§κ³ μ¬ κ±°λΌλ μμμ ν μ μμ΅λλ€.
REST API νμ© μμ(2)-RESPONSE
200 (OK)
201 (Created)
202 (Accepted)
204 (No Content)
301 (Moved Permanently)
μΆκ°)
openweather API μμ
import requests
import json
API_URL = 'https://api.openweathermap.org/data/2.5/weather?q=Seoul&appid=3b8fb7eea967548d8cb2837639e4ca9e'
raw_data = requests.get(API_URL)
parsed_data = json.loads(raw_data.text)
print(parsed_data)
json.loads()λ raw_dataμ str ννλ₯Ό νμ΄μ¬μ dictionary ννλ‘ λ°κΏμ£Όλ μν μ ν©λλ€.
- JavaScript : JSON, Trueμ False κ° μλ¬Έμλ‘ νν, μλ°μ΄νλ§ μ¬μ©
- Python : Dictionary
json.loads() : νμ΄μ¬μ Dictionary ννλ‘ λ°κΏμ€λλ€.
json.dumps() : loads μλ κ±°κΎΈλ‘ JavaScriptμ json νν(νμ΄μ¬μμμ νμμ strν)μΌλ‘ λ°κΏμ€λλ€.
'πΏ Data > λΆνΈμΊ ν' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[TIL]56. Section3_Sprint2_Chall (0) | 2022.02.03 |
---|---|
[TIL]55. NoSQL (0) | 2022.01.28 |
[TIL]53. Web_Scraping (0) | 2022.01.27 |
[TIL]52. Python_Intensive(Debuging, Class) (0) | 2022.01.26 |
[TIL]51. Section3_sprint1_challenge (0) | 2022.01.24 |