JSP 단에서 GET 방식으로 요청을 보내고 그걸 Python Flask 로 받아서 처리한 값을 다시 JSP로 돌려주는걸 해보고싶었다.
쉽게 말하면 Flask 로 API를 만들어서 만든 API 에 요청을 쏴서 잘 처리되는지 해보고싶었다.
우선은 간단하게 JSP 에서 ajax 로 get 방식으로 API 호출하는걸 만들었다.
JAVA - index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<script>
$.ajax({
method: "GET",
// url: "https://dapi.kakao.com/v2/search/blog",
url: "http://127.0.0.1:8080/plus", // flask 서버로 던진다.
// data: { review : ["리뷰1","리뷰2","리뷰3"]}
data: { x: "2" , y : "3" },
// headers: {Authorization: "KakaoAK 9068483aa30e9a2150dad3527a5295a4"}
})
.done(function (msg) {
alert("Data Saved: " + msg.result )
});
</script>
|
cs |
GET 방식으로 내가 만들 Flask 서버 주소 ( 127.0.0.1:8080/plus ) 로 파라메터를 던진다.
그래서 만약 성공한다면 alert 으로 값을 띄워준다.
Python - app.py
python 에서는 간단하게 flask_restful 을 통해 RESTful API 구현이 가능하다.
( * http 에서 GET, POST , DELETE 등의 http 함수를 써서 json ,xml 을 통해 정보를 주고받는 api로써 기능을 하는걸 Restful API )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
from flask_restful import Resource
from flask_restful import reqparse
# CORS(Cross Origin Resource Sharing) : 동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법입니다.
# 다른 도메인이나 로컬 환경에서 자바스크립트로 api 등을 호출하는 경우 브라우저에서 동일 출처 위반의 에러가 나타날 수 있습니다
from flask_cors import CORS
class Plus(Resource):
def get(self):
try:
# 요청받은거를 받아주자
parser = reqparse.RequestParser()
# add_argument 를 통해 입력 파라미터를 설정할 수 있다.
parser.add_argument('x', required=True, type=int, help='x cannot be blank') # add_argument(*args, **kwargs)
parser.add_argument('y', required=True, type=int, help='y cannot be blank')
args = parser.parse_args() # Parse all arguments from the provided request and return the results as a Namespace
result = args['x'] + args['y']
return {'result': result} # 실제 돌려줄 값을 여기에 넣어준다.
except Exception as e:
return {'error': str(e)}
from flask import Flask
from flask_restful import Api
app = Flask('My First App')
api = Api(app)
CORS(app)
api.add_resource(Plus, '/plus')
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True)
|
cs |
나같은 경우에는 python 개발을 위해 conda( 아나콘다 ) 에 웬만한건 다 설치를 해놨지만
만약 없다면 pip install 을 통해서 없는 module 들을 설치한 다음에 진행하면 된다.
소스 자체는 간단하다.
class의 맴버 변수는 Restful api 의 함수를 의미한다.
따라서, get 함수 외에도 post, put , delete 등의 함수를 필요에 따라서 정의해서 사용하면 된다.
이렇게 정의된 클래스는 add_resource 함수로 경로와 함께 등록한다.
해석하면 127.0.0.1:8080/plus 로 GET 요청을 보내면 Result 키에 args['x'] + args['y']값을 JSON으로 반환해준다.
만약 CORS가 없는 상태에서 실행을 해봤다면 JSP -> Flask 로 값이 잘 넘어가는 걸 확인했는데
Flask -> JSP 로 응답이 오지 않을 수 도 있다.
원인은 CORS 를 해놓지 않았기 때문이다.
크롬에서는 다른 도메인이나 로컬 환경에서 자바스크립트로 API 등을 호출하는 경우, 브라우저에서 동일 출처 위반 에러가 나타날 수 있기때문에 CORS 하지 않으면 저렇게 에러가 난다.
*CORS(Cross Origin Resource Sharing) : 동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법
해결법은 간단하다.
import CORS 를 설치하고
app을 선언한 이후에 CORS(app) 를 추가해주면된다.
그렇게 되면 정상적으로 값이 출력되는걸 볼 수 있다.
'IT Diary > # Dev Diary' 카테고리의 다른 글
[ Dev Dairy ] 006. 연관어 네트웍크 분석 Networkx 사용해보기 (0) | 2021.07.28 |
---|---|
[ Dev Dairy ] 005. krwordrank 사용해보기 (0) | 2021.07.28 |
[ Dev Dairy ] 003. Teachable Machine 사용해보기 (0) | 2021.03.26 |
[ Dev Dairy ] 002. selenium 환경준비 (0) | 2021.03.16 |
[ Dev Dairy ] 001. 개발셋팅하기 ( 구름 IDE ) (0) | 2021.03.16 |