기본 콘텐츠로 건너뛰기

[Flask] 파이썬 Flask를 이용하여 REST API 만들기 - 2

[Flask] 파이썬 Flask를 이용하여 REST API 만들기 - 2

# 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 - CREATE, GET - 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/' ) def environments(language): return jsonify({ "language" :language}) if __name__ = = "__main__" : app.run() Colored by Color Scripter 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은 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"}이 도착한 것을 볼 수 있습니다.

from http://rekt77.tistory.com/104 by ccl(A) rewrite - 2020-03-06 03:54:14

댓글

이 블로그의 인기 게시물

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고...

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고... Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 1997년, 초창기 아마존에 입사한다고 상상해보세요. 그 당시 누구도 e-commerce 산업이, 아마존이라는 회사가 지금처럼 성장하리라고는 생각하지 못했을 것입니다. 하지만, 그 당시 아마존을 선택한 사람들은 e-commerce 산업을 개척했고, 아마존을 세계적인 회사로 성장시켰습니다. 2016년 '아시아의 아마존'으로 성장하고 있는 쿠팡, 당신에게 매력적인 선택이 아닐까요? Global Operation Technology: eCommerce에서 주문을 한 뒤 벌어지는 상황에 대해서 호기심을 가져보신 적이 있나요? Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 매일 최첨단 소프트웨어 기술을 이용해 고객의 주문을 받고 상품을 어느 창고에서 출고 시킬지, 포장을 하나의 박스 또는 여러 개로 나눌 것인지, 어떤 배송 루트를 선택하고 어떻게 고객에게 배송 상태를 보여줄지 결정하는 시스템과 서비스를 개발 합니다. What Global Operations Technology does: CS and C-Returns System 적극적 고객서비스를 바탕으로 고객의 목소리를 통해 끊임없이 고객 에게 서비스를 제공하고 Andon 메커니즘을 통해 고객의 목소리를 회사 전체와 공유합니다. 그리고 고객 문제 해결과 구매 이후 벌어질 수 있는 고객 문제를 사전에 예방하기 위한 시스템 개발을 통해 미래의 상황을 예측 합니다. Tranportation System TSP (Traveling Salesman Problem) 와 같은 CS 최적화 관리 문제를 다룹니다.배송 물품의 실시간 추적, 3P 하드웨어와 소프트웨어를 통합, 각 배송 루트에 할당되는 물량 예측하고 T...

스프링 프레임워크(Spring Framework)란?

스프링 프레임워크(Spring Framework)란? "코드로 배우느 스프링 웹 프로젝트"책을 개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다. '스프링 프레임워크'가 무엇인지 말 할 수 있고, 해당 프레임워크의 특징 및 장단점을 설명할 수 잇는 것을 목표로합니다. 1. 프레임워크란? 2. 스프링 프레임워크 "뼈대나 근간을 이루는 코드들의 묶음" Spring(Java의 웹 프레임워크), Django(Python의 웹 프레임워크), Flask(Python의 마이크로 웹 프레임워크), Ruby on rails(Ruby의 웹 프레임워크), .NET Framework, Node.js(Express.js 프레임워크) 등등. 프레임워 워크 종류 : 3. 개발 시간을 단축할 수 있다. 2. 일정한 품질이 보장된 결과물을 얻을 수 있다. 1. 실력이 부족한 개발자라 허다러도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다. 프레임워크를 사용하면 크게 다음 3가지의 장점 이 있습니다. 프레임워크 이용 한다는 의미 : 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발 한다. => 이러한 상황을 극복하기 위한 코드의 결과물이 '프레임워크' 입니다. 개발자는 각 개개인의 능력차이가 크고, 따라서 개발자 구성에 따라서 프로젝트의 결과 차이가 큽니다. 2. 스프링 프레임워크(Spring Framework) 자바 플랫폼을 위한 오픈 소스 애플리케이션 스프링의 다른 프레임워크와 가장 큰 차이점은 다른 프레임워크들의 포용 입니다. 이는 다시말해 기본 뼈대를 흔들지 않고, 여러 종류의 프레임워크를 혼용해서 사용할 수 있다는 점입니다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크 이다. 여러 프레임워크들 중 자바(JAV...

Flask 18. jQuery와 ajax

Flask 18. jQuery와 ajax 현재 우리는 api를 만들고 있다. api를 사용하기 위해서는 ajax를 사용해야한다. 그리고 ajax를 편하게 쓸 수 있도록 도와주는 것이 jquery라이브러리이다. ajax는 비동기로 서버에 요청할 수 있다. 브라우저에 XMLHttpRequest객체가 있어서 이것을 사용해서 서버에 데이터를 요청할 수 있다. 기존에는 웹에 접근할 때 주소에다가 서버의 주소를 씀으로써 데이터(페이지)를 요청할 수 있고, form을 만드는 방법이 있다. 이러한 방법들은 페이지 이동이 일어나서 서버에서 무조건 응답으로 웹페이지를 만들어서 응답해야하는 단점이 있었다 그러나 api를 사용하면 리소스 중심으로 데이터의 이동만 일어난다. 클라이언트는 데이터만 받기 때문에 데이터로 웹을 만들어야한다. 화면은 이미 만들어져있는 상태에서 비동기로 화면을 전환하지 않고, 서버에 데이터 요청을 한 후 그 데이터를 기반으로 웹에 그 데이터를 반영하는 것이다. 이것들은 백그라운드에서 일어난다. 이것을 위해서는 자바스크립트를 이용해야하고 jquery를 이용할 것이다. jquery는 여러 셀렉터를 사용할 수 있어서 편하다. 자바스크립트 작업을 좀더 생산성 좋게 작업할 수 있도록 해준다. 가장 큰 특징은 ajax요청을 아주 쉽게 할 수 있다. 정리 비동기 요청을 위해서 ajax를 사용할 것이고, 그러나 순수자바스크립트는 어렵기 때문에 jquery를 사용할 것이다. 공유하기 글 요소 저작자표시 from http://ohdowon064.tistory.com/134 by ccl(A) rewrite - 2020-03-24 10:54:10