이번에는 request 할 때, 서버로 데이터를 전송하는 것에 대해서 알아보겠습니다.
먼저 데이터를 전송하는 방법에 대해서 정리해 보겠습니다.
클라이언트에서 서버로 http를 이용해서 데이터를 전송하는 방법은 크게 3가지가 있습니다.
1. Query string
2. URI parameter
3. request body
Query string 은 request 뒤에 [key]=[value] 형식으로 값을 붙여서 전달하는 방식입니다.
ex)
curl "http://localhost:5000?key=value"
두 개 이상 값을 전송할 때는 key, value 셋 사이에 &를 사용합니다.
curl "http://localhost:5000?key1=value1&key2=value2"
URI parameter는 URL에 값을 넣어서 호출하는 방식으로, 서버쪽에서 URL을 parsing 해서 사용합니다.
ex)
category 에 food 라는 값을 전송
curl http://localhost:5000/category/food
category1 에는 food, category2 에는 fruit 전송
curl http://localhost:5000/category1/food/category2/fruit
request body 의 경우는 POST method를 이용해서 데이터를 추가로 전송합니다.
ex)
form 전송
curl -X POST http://localhost:5000 -d 'key1=value1&key2=value2'
json 데이터 전송 (header 정보가 필요합니다.)
curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'
각각에 대해서 flask 서버에서 처리하는 방법은 다음과 같습니다.
먼저 Query string 을 처리하는 방법입니다.
request.args.get(<key>) 를 이용해서 값을 받아 올 수 있습니다.
@app.route("/query")
def query_test():
return ("<br>".join( map(lambda key: '{}={}'.format(key, request.args.get(key)), request.args) ))
테스트를 위해서는 아래와 같이 path 를 query로 지정합니다.
curl "http://localhost:5000/query?key=value"
URI parameter 를 처리하는 방법입니다.
route annotation path에 parameter들을 <> 를 이용해서 세팅합니다.
method에 해당 parameter를 인자로 받아서 처리합니다.
@app.route("/category1/<category1>/category2/<category2>")
def uri_test(category1, category2):
return "<p>Category1: {} <br>Category2: {}</p>".format(category1, category2)
아래 처럼 호출을 하면,
curl http://localhost:5000/category1/food/category2/fruit
category1 은 food, category2 는 fruit 이 들어오는 것을 확인할 수 있습니다.
request body로 오는 정보는 request.form, request.json 혹은 request.data 으로 처리할 수 있습니다.
form은 데이터가 query string 과 같이 <key>=<value> 형식으로 오는 경우 처리가 가능합니다.
json은 header에 Content-Type 을 application/json 으로 지정해주고, body가 json 포맷으로 되어 있는 경우 처리가 가능합니다.
마지막으로 data는 클라이언트에서 보내주는 binary 데이터를 그대로 받아올 수 있습니다.
먼저 method 를 POST 로 지정해 줍니다.
form의 경우는 method를 지정해 주고, 위의 query에서 사용한 request.args 를 request.form 으로 변경해 주기만 하면 됩니다.
참고로 query 혹은 form 에 대해서 방식에 관계없이 처리하는 경우에는 request.value 를 이용할 수 있습니다. query 와 form 모두 같은 키로 데이터를 보낸 경우 query가 우선합니다.
@app.route("/form", methods=['POST'])
def form():
return ("<br>".join( map(lambda key: '{}={}'.format(key, request.form.get(key)), request.form) ))
json의 경우 request.json 을 이용하면 됩니다.
import json
...
@app.route("/json", methods=['POST'])
def json_test():
return json.dumps(request.json)
테스트 할 때는 header를 지정해야 합니다.
curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'
'프로그래밍 > Python - Flask' 카테고리의 다른 글
Python Flask를 이용해서 REST 서비스 구현하기 3 - request method (0) | 2022.02.12 |
---|---|
Python Flask를 이용해서 REST 서비스 구현하기 2 - 경로 추가 (0) | 2022.01.14 |
Python Flask를 이용해서 REST 서비스 구현하기 1 - 기본 설정 (0) | 2021.12.17 |