π RESTλ 무μμΈκ° ?
REST : Representational State Transfer
= μμμ μ΄λ¦(μμμ νν)μΌλ‘ ꡬλΆνμ¬ ν΄λΉ μμμ μνλ₯Ό μ£Όκ³ λ°λ κ²μ μλ―Ένλ€.
= μ¦, μμ(resourece) μ νν(representation)μ μν "μν μ λ¬"
- μμμ νν
- μμ : ν΄λΉ μννΈμ¨μ΄κ° κ΄λ¦¬νλ λͺ¨λ κ² ( ex. κ·Έλ¦Ό, λ¬Έμ, λ°μ΄ν° λ± )
- μμμ νν : κ·Έ μμμ νννκΈ° μν μ΄λ¦
- μν(μ 보) μ λ¬
- λ°μ΄ν°κ° μμ²λλ μμ μμ μμμ μν(μ 보)λ₯Ό μ λ¬νλ€.
- JSON νΉμ XMLμ ν΅ν΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ κ²μ΄ 보ν΅μ μ λ¬ λ°©μμ΄λ€.
WWW(World Wide Web) μ κ°μ μμ€ν μ μν μννΈμ¨μ΄ κ°λ° μν€ν μ²μ ν νμμ΄λ€.
RESTλ κΈ°λ³Έμ μΌλ‘ μΉμ κΈ°μ‘΄ κΈ°μ κ³Ό HTTP νλ‘ν μ½μ κ·Έλλ‘ μ¬μ©νκΈ° λλ¬Έμ, μΉμ μ₯μ μ μ΅λν νμ©ν μ μλ
μν€ν
μ² μ€νμΌμ΄λ€. RESTλ λ€νΈμν¬ μμμ ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄μ ν΅μ λ°©μ μ€ νλμ΄λ€.
π‘ RESTμ ꡬ체μ μΈ κ°λ
HTTP URI(Uniform Resource Identifier)μ ν΅ν΄ μμμ λͺ μνκ³ , HTTP Method(POST, GET, PUT, DELETE)λ₯Ό ν΅ν΄ ν΄λΉ μμμ λν CRUD Operationμ μ μ©νλ κ²μ μλ―Ένλ€.
- RESTλ μμ κΈ°λ°μ ꡬ쑰(ROA) μ€κ³μ μ€μ¬μ μμμ΄ μκ³ , HTTP Methodλ₯Ό ν΅ν΄ μμμ μ²λ¦¬νλλ‘ μ€κ³λ μν€ν μ³λ₯Ό μλ―Ένλ€.
π‘ CRUD
- Create : μμ±(POST)
- Read : μ‘°ν(GET)
- Update : κ°±μ (PUT)
- Delete : μμ (DELETE)
- HEAD : header μ 보 μ‘°ν(HEAD)
π‘ REST μ₯λ¨μ
μ₯μ
- μλ²μ ν΄λΌμ΄μΈνΈμ μν μ λͺ ννκ² λΆλ¦¬νλ€.
- μ¬λ¬κ°μ§ μλΉμ€ λμμΈμμ μκΈΈ μ μλ λ¬Έμ λ₯Ό μ΅μννλ€.
- REST API λ©μμ§κ° μλνλ λ°λ₯Ό λͺ ννκ² λνλ΄λ―λ‘, μλνλ λ°λ₯Ό μ½κ² νμ ν μ μλ€.
- HTTP νμ€ νλ‘ν μ½μ λ°λ₯΄λ λͺ¨λ νλ«νΌμμ μ¬μ©μ΄ κ°λ₯νλ€.
- HTTP νμ€ νλ‘ν μ½μ νμ€μ μ΅λν νμ©νμ¬ μ¬λ¬ μΆκ°μ μΈ μ₯μ μ ν¨κ» κ°μ Έκ° μ μκ² ν΄μ€λ€.
λ¨μ
- μ¬μ©ν μ μλ λ©μλκ° 4κ°μ§ λ°μ μλ€. (POST,GET,PUT,DELETE)
- νμ€μ΄ μ‘΄μ¬νμ§ μλλ€.
π‘ κ·ΈλΌμλ, RESTκ° μ νμνκ° ?
- λ€ν₯ν ν΄λΌμ΄μΈνΈμ λ±μ₯
- μ ν리μΌμ΄μ λΆλ¦¬ λ° ν΅ν©
μ΅κ·Ό μλ² νλ‘κ·Έλ¨μ λ€μν λΈλΌμ°μ (chrome, Explorer, safari λ±)μ μλλ‘μ΄λν°, μμ΄ν°κ³Ό κ°μ λͺ¨λ°μΌ λλ°μ΄μ€μμλ ν΅μ ν μ μμ΄μΌ νκΈ° λλ¬Έμ΄λ€.
π‘ REST ꡬμ±μμ
- μμ(Resource) : URI
- μΉ μλ²μ μμμ κ°μ μ΄λ¦μ κ°μ§κ³ μλ€.
- λ°λΌμ, ν΄λΌμ΄μΈνΈλ μ΄λ¬ν μ΄λ¦μ ν΅ν΄ μνλ μ 보λ₯Ό μ°Ύμ μ μλ€.
- μ΄λ μλ² μμμ μ΄λ¦μ URIλΌκ³ νλ€.
- νμ(Verb) : HTTP Method
- HTTP νλ‘ν μ½μ GET,POST,PUT,DELETEμ κ°μ λ©μλλ₯Ό μ 곡νλ€.
- νν(Representation of Resource)
- ν΄λΌμ΄μΈνΈκ° μμμ μν(μ 보)μ λν΄ μμ²νλ©΄, μλ²λ μ΄μ μ μ ν μλ΅μ 보λ΄μΌνλ€.
- RESTμ νλμ μμμ JSON, XML, TEXT, RSS λ± μ¬λ¬ ννμ μλ΅μΌλ‘ λνλΌ μ μλ€.
- νμ§λ§, λ³΄ν΅ JSON μ΄λ XMLμ ν΅ν΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ κ²μ΄ μΌλ°μ μ΄λ€.
π HTTP Method : [ POST ]
HTTP λ©μλ μ€ POSTλ μμ²μ μ²λ¦¬νκΈ° μν΄ μ¬μ©μ(ν΄λΌμ΄μΈνΈ)λ‘λΆν° νΉμ μμ(form)μ "λ°μ΄ν°λ₯Ό μνΈν"νμ¬ μλ²λ‘ μ μ‘νλ λ°©λ²μ΄λ€.
μλ²λ POST λ°©μμΌλ‘ μ λ¬ λ°μ λ°μ΄ν°λ₯Ό ν΅ν΄ νΉμ λμμ μνν μ μλ€.
μλ‘ λ‘κ·ΈμΈ μμλ₯Ό 보μ.
<!-- login.html -->
<html>
<body>
<form action = "/login" method = "post">
<table>
<tr><td>μμ΄λ</td>
<td><input type ="text" name ="id"></td></tr>
<tr><td>λΉλ°λ²νΈ</td>
<td><input type ="password" name ="pass"></td></tr>
<tr><td><input type = "submit"></td></tr>
</table>
</form>
</body>
</html>
# login.py
from flask import *
# Flask μΈμ€ν΄μ€ μμ±
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('login.html')
# login μ£Όμμμ POST λ°©μμ μμ²μ λ°μμ λ
@app.route('/login',methods = ['POST'])
def login():
id = request.form['id']
passwrd = request.form['pass']
if id=="Elice" and passwrd=="Awesome!":
return "Welcome %s" % id
if __name__ == '__main__':
app.run()
μ΄λ, login.html μμ "μμ΄λ"μ "λΉλ°λ²νΈ"λ₯Ό μ
λ ₯νκ³ , "λ²νΌμ λλ₯΄λ©΄" login.py μμ μ΄λ₯Ό μΈμν΄μ
"Elice" μ΄κ³ , λΉλ°λ²νΈκ° "Awesome!" μ΄λ©΄, "Welcome Elice" λΌλ λ¬Έκ΅¬κ° λνλλ€.
π HTTP Method : [ GET ]
GET μμ² λν μ¬μ©μ(ν΄λΌμ΄μΈνΈ)λ‘λΆν° νΉμ μμ(form)μ λ°μ΄ν°λ₯Ό μλ²λ‘ μ μ‘νλ λ°©λ²μ΄λ€.
κ°μ₯ ν° μ°¨μ΄λ μ 보λ₯Ό URLμ λΆμ¬μ 보λ΄κ² λκ³ , μ¦, "λ°μ΄ν°κ° μνΈνλμ§ μλλ€λ μ "μ΄λ€.
μμ λ‘κ·ΈμΈ μμλ₯Ό ν΅ν΄ 보μ.
<!-- login.html -->
<html>
<body>
<form action = "/login" method = "get">
<table>
<tr><td>μμ΄λ</td>
<td><input type ="text" name ="id"></td></tr>
<tr><td>λΉλ°λ²νΈ</td>
<td><input type ="password" name ="pass"></td></tr>
<tr><td><input type = "submit"></td></tr>
</table>
</form>
</body>
</html>
# login.py
from flask import *
# Flask μΈμ€ν΄μ€ μμ±
app = Flask(__name__)
# login μ£Όμμμ GET λ°©μμ μμ²μ λ°μμ λ
# @app.route()μμ methods μΈμμ κΈ°λ³Έ κ°μ GETμΌλ‘ μλ΅ν΄μ μμ±ν΄λ λ©λλ€.
@app.route('/login',methods = ['GET'])
def login():
id = request.args.get['id']
passwrd = request.args.get['pass']
if id=="Elice" and passwrd=="Awesome!":
return "Welcome %s" % id
if __name__ == '__main__':
app.run()
GETμ΄ POST λ°©μκ³Ό κ°μ₯ ν° μ°¨μ΄μ μ URLμ "https://localhost:8080/login?id=elice&pass=awesome" μΌλ‘ ννλλ€.
μ¦, λ‘κ·ΈμΈ ν λ, URLμ μμ΄λμ λΉλ°λ²νΈκ° νκΈ°λλ€. ( = λ°μ΄ν°κ° μνΈνκ° λμ§ μλλ€. )
μ΄λ, ννΈμΌλ‘ μ 보보μμ μ μ§ν μ μλ€λ κ²μ μλ―Ένλ€.
λ°λΌμ, "λ‘κ·ΈμΈ"κ³Ό κ°μ΄ μ 보λ₯Ό κ°λ €μΌν λλ GETμ΄ μλ POST λ°©μμ μ¬μ©νλ κ²μ΄ λ§λ€.
π HTTP - POST μμ
POST μμ²μ λμ νλΌλ―Έν°κ° 보μ΄λ GETμμ²κ³Ό λ¬λ¦¬ μ λ¬νλ €λ μ λ³΄κ° HTTP bodyμ ν¬ν¨λμ΄ μ λ¬λλ€.
μ λ¬νλ €λ μ 보λ form data, json strings λ±μ΄ μλ€.
render_templates( ) λ©μλ = Flask μμ html νμΌμ "λλλ§" νκΈ° μν΄μ μ¬μ©νλ€.
( λλλ§(Rendering) = μΉ λΈλΌμ°μ μμ νλ©΄μ νννλ κ³Όμ )
POSTλ‘ μ λ¬λ°μ "κ°"μ request.form[ 'λ³μλͺ ' ]μ μ¬μ©νλ©΄ htmlμ formμμ ν΄λΉ λ³μλͺ μ λ§μ‘± κ°μ μ¬μ©κ°λ₯
from flask import Flask
from flask import request
from flask import render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('index.html')
@app.route("/post", methods=['POST'])
def post():
#1λ²μ ν΄λ³΄μΈμ!
value = request.form["input"]
msg = "%s λ νμν©λλ€." % value
return msg
if __name__ == '__main__':
app.run()
<!-- μ¬μ©νλ html νμΌλ€μ, λ°λμ templates λλ ν°λ¦¬ μμ μμ΄μΌνλ€. !! -->
<!-- /templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<form action = "/post" method="post">
<p>
μ΄λ¦ :
<input type="text" name = "input">
</p>
<p>
μ΄λ¦μ μ
λ ₯νκ³ μ μΆλ²νΌμ λλ₯΄μΈμ.<br>
<input type = "submit" value = "μ μΆ" onclick = "alert('μ μΆ μλ£!')" />
</p>
</form>
</body>
</html>
π HTTP - GET μμ
Flask μμ GET λλ POSTλ‘ μ λ¬λ°μ μ 보λ₯Ό request λͺ¨λμ μ¬μ©νμ¬ νμ©ν μ μλ€.
GET λ°©μμ κ²½μ° λͺ¨λ νλΌλ―Έν°λ₯Ό URLλ‘ λ³΄λ΄ μμ²νλ λ°©μμ΄λΌκ³ νλ€.
request λͺ¨λμλ GET λ°©μμΌλ‘ URLμ μΈμλ₯Ό 'key = value' ννλ‘ μ λ¬νμ λ, λ€μ λ°©μμΌλ‘ νμ©νλ€.
- λ€μκ³Ό μμμ κ°μ μ£Όμλ₯Ό μ λ ₯νμ μ, numberμ κ°μ = 1 (https://μ£Όμ.com/?key=1)
number = request.args.get('key`, μ΄κΈ°κ°)
μ΄κΈ°κ°μ key κ°μΌλ‘ μ무 κ°λ λ겨λ°μ§ λͺ»νμ λ νμ©λλ κ°μ΄λ€. μ΄νμλ URLμ ν΅ν΄ '/?key=value' ννλ‘
keyκ°μ μ λ¬λ°μΌλ©΄ ν΄λΉ κ°μ μ¬μ©νλ€.
μ¬λ¬κ°μ keyμ κ°μ μ λ¬λ°μΌλ €λ©΄ λ€μ μμμ κ°μ΄ '&' κΈ°νΈλ₯Ό μ λ ₯νμ¬ μΆκ°ν μ μλ€.
- keyμ κ°μ 1, valueμ κ°μ 2 (https://μ£Όμ.com/?key=1&value=2)
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/') # Defaultλ HTTP methods = ['GET ']
def user_juso():
temp1 = request.args.get("word1","Elice") # GET λ°©μμΌλ‘, request.args.get() ν λ,
temp2 = request.args.get("word2","Hello") # μ£Όμμ κ°μ΄ μ§μ μλλ©΄ κΈ°λ³Έκ°μ, λ€μκ³Ό κ°μμ μλ―Έ
return temp1 + "<br>" + temp2
if __name__ == '__main__':
app.run()
π HTTP - GET & POST μμ
GETκ³Ό POSTλ₯Ό λμμ μ¬μ©ν΄μ μΉ νμ΄μ§λ₯Ό λμ μν¬ μ μλ€.
methodκ° GETμ΄λ©΄ μ΄λ¦μ μ λ ₯λ°λ μΉ νμ΄μ§λ₯Ό λμμν€κ³ , POSTλΌλ©΄ μ λ ₯ κ°μ κ°μ ν¬ν¨νλ λ¬Έμ₯μ μΆλ ₯νλ€.
<!-- templates/index2.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<form action = "/" method="POST">
<p>
μ΄λ¦ :
<input type="text" id = "input" name = "input">
</p>
<p>
μ΄λ¦μ μ
λ ₯νκ³ μ μΆλ²νΌμ λλ₯΄μΈμ.
<input type = "submit" value = "μ μΆ" onclick = "alert('μ μΆ μλ£!')" />
</p>
</form>
</body>
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/', methods=["GET","POST"]) # GET λλ POSTκ° νΈμΆλ μ μλ€λ κ²
def post():
if request.method == "POST":
value = request.form["input"] # index2.htmlκ°μ formνν¬λ₯Ό 보면 μμμ method = "POST" μΌκ²μ΄λ€.
return f"{value}λ νμν©λλ€."
if request.method == "GET":
return render_template("index2.html")
if __name__ == '__main__':
app.run()
π API μ End pointκ° λ¬΄μμΈκ° ?
APIλ νλ‘κ·Έλ¨λ€μ΄ μλ‘ μνΈμμ©νλ κ²μ λμμ£Όλ 맀체μ΄λ€.
μ°λ¦¬κ° μμμ μ κ°μ λ, μλμ κ°μ΄ νλνλ€. μ μμ μλμκ² λ©λ΄λ₯Ό μλ €μ£Όκ³ , μ£Όλ°©μ μ£Όλ¬Έλ°μ μ리λ₯Ό μμ²νλ€.
κ·Έ λ€μ μ£Όλ°©μμ μμ±λ μ리λ₯Ό μλμκ² λ€μ μ λ¬νλ€.
- μλκ³Ό μ리μ¬λ "End Point"
- μ μμ μ΄ λ μ¬μ΄μμ "API"
APIλ μλ(νλ‘κ·Έλ¨)μ΄ μ£Όλ¬Έν μ μκ² λ©λ΄(λͺ λ Ή λͺ©λ‘)λ₯Ό μ 리νκ³ , μ£Όλ¬Έ(λͺ λ Ή)μ λ°μΌλ©΄ μ리μ¬(μμ©νλ‘κ·Έλ¨)μ μνΈμμ©νμ¬ μμ²λ λ©λ΄(λͺ λ Ήμ λν κ°)λ₯Ό μ λ¬νλ€.
π‘ APIμ μν μ 무μμΈκ° ?
1. APIλ μλ²μ λ°μ΄ν°λ² μ΄μ€μ λν μΆμ ꡬ μν μ νλ€.
- λ°μ΄ν°λ² μ΄μ€μλ μ 보λ€μ΄ μ μ₯λλ€.
- λ°λΌμ, λͺ¨λ μ¬λλ€μ΄ μ΄ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όν μ μμΌλ©΄ μλλ€.
- APIλ μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μ°λ¦¬κ° κ°μ§ μλ²μ λ°μ΄ν°λ² μ΄μ€μ λν μΆμ ꡬ μν μ νλ©°, νμ©λ μ¬λλ€μκ²λ§ μ κ·Όμ±μ λΆμ¬ν΄μ€λ€.
2. APIλ νλ‘κ·Έλ¨κ³Ό κΈ°κΈ°κ° μννκ² ν΅μ ν μ μλλ‘ νλ€.
- μ°λ¦¬κ° νν μκ³ μ¬μ©νκ³ μλ μ€λ§νΈν° μ΄νμ΄λ νλ‘κ·Έλ¨κ³Ό κΈ°κΈ°κ° λ°μ΄ν°λ₯Ό μνν μ£Όκ³ λ°μ μ μλλ‘ λλ μν μ νλ€.
3. APIλ λͺ¨λ μ μμ νμ€ννλ€.
- APIλ λͺ¨λ μ μμ νμ€ννκΈ° λλ¬Έμ κΈ°κΈ°λ μ΄μ체μ λ±κ³Ό μκ΄μμ΄ λꡬλ λμΌν κΆνμ μ»μ μ μλ€.
π‘ API Testing
API Testing μ APIλ₯Ό ν μ€νΈνμ¬ κΈ°λ₯, μ±λ₯, μ λ’°μ±, 보μ μΈ‘λ©΄μμ κΈ°λλ₯Ό μΆ©μ‘±νλμ§ νμΈνλ ν μ€ν μ ν μ ν
μλ²½νκ² μλνλ APIλ§μ΄ μ€μ μ ν리μΌμ΄μ
μμ μ¬μ©ν μ μλ€.
λ°λΌμ, μ μμ μΌλ‘ μλ²½νκ² μλνλμ§ ν
μ€νΈ ν΄μΌνλ€.
API ν
μ€νΈλ₯Ό μ§ννκ² λλ©΄ ν₯ν νΉμ μμ μμ λ°μν μ μλ μ ν리μΌμ΄μ
μ λ§μ λ¬Έμ μ λ€μ ν΄κ²°ν μ μλ€.
'python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Flask] (4) μΈμ¦ & λ‘κ·ΈμΈκ΅¬ν & λ‘κΉ (0) | 2021.01.25 |
---|---|
[Flask] (3) λ λλ§ ν νλ¦Ώ & Jinja2 & κ°λ¨ν κ²μν (0) | 2021.01.24 |
[Flask] (1) Intro & URL Routing & Variable Rules & jsonify( ) (1) | 2021.01.21 |
[python] λ¬Έμμ΄ μ κ·ννμ μ 리 (0) | 2021.01.14 |
[python] if __name__ == '__main__' : μ μ 체 (2) | 2021.01.09 |