# Flask

 

 

1. REST API란?

 

REST API란 Representational State Transfer의 약자로 자원의 이름을 기반으로 하여 상태를 주고 받는 것을 뜻합니다.  JSON이나 XML의 형태로 데이터를 주고 받는 것이 일반적이며 URI(Uniform Resource Identifier)를 통해 자원을 명시하고 HTTP 프로토콜에서 제공하는 메소드를 활용해 해당자원에 대한 CRUD를 동작하게 하는 API입니다.

※CRUD = Create, Read, Update, Delete

 

 


 

 

2. URL과 URI의 차이

 

URL은 Uniform Resource Locator로써 해당 경로에 실제 존재하는 자원의 위치를 가르키는 것입니다. 예를 들어  http://rekt77.tistory.com/test.txt 라는 URL은 웹 서버 root 디렉터리에 실제로 존재하는 test.txt 파일을 요청하기 위한 주소입니다. 

 

반면 URI는 Uniform Resource Identifier로써 요청하는 주소가 실제 존재하는 파일이라기 보다는 기능을 하기위한 구분자로 보는 것입니다. 이전 강의에서 Flask를 통해 /user라는 URI에 요청이 들어왔을 때 특정 동작을 실행하게 끔 구현했었던 것을 기억하실 겁니다. 실제 우리 서버 안에는 user라는 파일은 존재하지 않습니다. 단지 자원의 구분자로써의 역할을 하며 접근하는 구분자에 따라 CRUD operation을 실행하게 하는 주소입니다.

 

URL은 URI의 하위 개념입니다. 정확하게 말하자면 URI는 URL의 개념을 포함하고 있기때문에 위에서 언급한 http://rekt77.tistory.com/test.txt는 URI라고도 할 수 있는 것이죠. 하지만 URI는 URL의 상위 개념이기 때문에 /user라는 주소는 URL이 될 수 없습니다.

 

 


 

 

3. Flask를 이용한 기본적인 REST API 구현

 

Flask는 API설계를 가장 간단하게 할 수 있는 프레임워크중 하나 입니다. 먼저 REST API를 구축하기위해서 데이터를 json형식으로 리턴해야 합니다. Flask는 데이터를 json형식으로 치환하기 위한 jsonify라는 함수를 제공하고 있습니다.

 

또한 요청이 들어왔을 때 HTTP 메소드 별로 실행 루틴을 다르게 구현할 수 있습니다. 또한 json형태의 데이터를 받아오기위하여 Flask내에 request라는 클래스를 사용할 것입니다.

 

사실 REST API는 GET, POST 외에 PUT과 DELETE 메소드를 사용해서 CRUD operation을 구축해야 합니다. 하지만 이 두개의 메소드는 보안상의 취약점이 존재하고 있어 일반적인 상황에서는 사용이 어렵습니다.

※ CRUD 매핑: POST - CREATEGET - READ, PUT - UPDATE, DELETE - DELETE

※ GET - URI에 주소에 파라미터를 추가하여 요청하는 방식(HTTP Header에 추가하는 방식)

※ POST - HTTP Body에 데이터를 추가하여 요청하는 방식

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, request, jsonify
app = Flask(__name__)
 
@app.route('/userLogin', methods = ['POST'])
def userLogin():
    user = request.get_json()#json 데이터를 받아옴
    return jsonify(user)# 받아온 데이터를 다시 전송
 
@app.route('/environments/<language>')
def environments(language):
    return jsonify({"language":language})
 
 
if __name__ == "__main__":
    app.run()
cs

 

위 코드를 실행시키면 127.0.0.1:5000/ 아래에 두개의 URI가 생성됩니다.  userLogin과 environments인데요 userLogin은 POST 방식으로 접근해야하는 API입니다. 동작방식은 받은 json을 그대로 돌려주는 형태입니다. environments는 URI 마지막 구분자에 넣어준 값을 json형태로 반환해주는 API입니다. 이 때의 키 값은 language가 됩니다. 

 

그러면 위의 소스코드를 실행 시키고 테스트를 진행해 보겠습니다. test하기위한 도구는 Restlet 입니다.

 

링크: https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm

 

Restlet Client - REST API Testing

Visually create and run single HTTP requests as well as complex scenarios. Automate your API tests with our CI/CD plugin.

chrome.google.com

Restlet은 Rest API를 테스트 하는데 사용하는 chrome 웹 브라우저의 익스텐션입니다.  사용방법이 간편하며 성능이 뛰어납니다. 회원가입 하시고 로그인 하시면 아래와 같은 화면을 볼 수 있습니다.

 

Restlet 메인화면

 

먼저 상단의 requests를 선택하여 요청을 생성하겠습니다. GET 메소드를 테스트 할 것이기 때문에 메소드를 GET으로 놓고 URI를 명시해줍니다. http://127.0.0.1:500/environsments/python으로 실행하겠습니다. SEND 버튼을 눌러 요청을 보내면 보시는 바와 같이 Response가 도착하는데요 200 OK라는 Status code는 웹 요청이 정상적으로 이루어 졌고 응답을 받았다고 이해하시면 됩니다. Response 헤더는 전송받은 데이터 타입에 따라 변경되는 데요 json을 받았기 때문에 application/json으로 설정되어있습니다.

 

그리고 제가 의도 한대로 json이 응답으로 도착한 것을 볼 수 있습니다.( {'language':'python'})

 

이번에는 POST를 테스트 해보겠습니다.

 

POST 실행결과

 

메소드를 POST로 설정하고 URI를 명시합니다. 이후에 HEADER 설정이 중요한데요, 우리는 json형태의 데이터를 전송할 것이기 때문에 Content-Type을 application/json으로 설정합니다. 그리고 BODY 값에 원하는 json을 넣어주시면 전송한 json이 그대로 도착할 것입니다.

 

맨 마지막 빨간색 박스를 보시면 Response가 들어있습니다. json을 받았기 때문에 역시 Contnet-Type은 application/json입니다. 그리고 Response Body값으로 {"userName":"rekt77"}이 도착한 것을 볼 수 있습니다.

'Dev > Flask' 카테고리의 다른 글

[Flask] 파이썬 Flask를 이용하여 REST API 만들기 - 1  (1) 2019.04.09

+ Recent posts