메뉴 닫기

묻지마 https resutful api service

묻지마 https resutful api service

nginx 웹서비스와 python에서 flask 프레임워크로 생각없이 restful api service를 구성 해보자.

ssl 서버 구축

사설 ssl 인증서 생성

cat ~/bin/nginx-ssl.sh

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt \
-subj "/C=KR/ST=Seoul/L=Seoul/O=Open Security/OU=IT Department/CN=api.cloudv.kr"

Nginx ssl 인증서 설정

cat /etc/niginx/site-available/api.conf

server {
    listen 80;
    listen 443 ssl;
    server_name localhost;

   ssl_certificate /etc/nginx/ssl/nginx.crt;
   ssl_certificate_key /etc/nginx/ssl/nginx.key;


    location /api
    {
        dav_methods PUT DELETE;
        dav_access all:r;
        proxy_pass http://localhost:5000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Rest API 서버

mkdir -p ~/rest-api/app

cat ~/rest-api/run.py

 

#!~/venv/bin/python

from app import app
app.run(debug=True)

cat ~/rest-api/app/init.py

from flask import Flask

app = Flask(__name__)

from app import api

cat ~/rest-api/app/api.py

from flask import  request,  jsonify, make_response
from app import app
from pprint import pprint 
from datetime import datetime 
@app.route('/api/echo', methods=['GET', 'POST', 'PUT', 'DELETE' ])
def echo():
    if request.method ==  'GET' :
            return jsonify( { 'method': 'GET' } )
    data = request.get_json(force=True);
    return jsonify({ 'method' : request.method , 'data': data } )

@app.route('/api/uptime', methods=['GET', 'POST', 'PUT', 'DELETE'])
def uptime():
    with open('/proc/uptime', 'r') as f:
        uptime_seconds = float(f.readline().split()[0])
        uptime_string = str(timedelta(seconds = uptime_seconds))

    data={  'uptime':  uptime_string }
    return jsonify(results=data)

실행

$ sudo service nginx restart
$ sudo ~/rest-api/run.py

예제 시험

$ curl --k  https://localhost/api/echo 
{
  "method": "GET"
}

$ cat a.json 
{
      "fruit": "strawberry" 
}

$ sudo curl  -k  -H "Content-Type: application/json" -d @a.json -X POST https://localhost/api/echo
{
  "data": {
    "fruit": "strawberry"
  },
  "method": "POST"
}

 curl  -k  -H "Content-Type: application/json" -d @a.json -X PUT https://localhost/api/echo
{
  "data": {
    "fruit": "strawberry"
  },
  "method": "PUT"
}


$  curl  -k  -H "Content-Type: application/json" -d @a.json -X DELETE https://localhost/api/echo
{
  "data": {
    "fruit": "strawberry"
  },
  "method": "DELETE"
}

마치는 말. nginx에 ssl 인증서를 설치하고 flask로 restapi 서버를 설치하고나서 api를 시험해보았다. 코드만 보아도 주석없이도 쉽게 이해가 될 정도의 수준이다. flask와 python 설치를 뱄지만, 그 정도는 인터넷에서 쉽게 찾아서 설치할 수 있을 것이다. 인프라에 코드를 넣기위해 시작하는 사람에게 스낵과 같이 가볍게 보고 지나갈수 있는 예제가 되길 바란다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x