개요
모바일로 측정한 후, 운영하고 있는 서버에 측정한 데이터를 보내야 하는데
보안 문제로 인해 바로 데이터를 보낼 수 없는 문제가 생겼다.
그래서 중간에 데이터를 받아서 전송할 수 있는 중계기를 만들어야 한다고 한다.
Python으로 Proxy 서버를 열어서 모바일 앱으로 전송된 데이터를 받아 Django 서버로 전달하여 저장 및 정보를 띄운다.
개발
Python 3.9.16
pip install requests socketserver
전체 코드
import urllib.request
from urllib.parse import parse_qs, urlparse
import requests
import sys
from http.server import BaseHTTPRequestHandler, HTTPServer
import socketserver
HOST = 'HOST 서버 정보'
SERVER_PORT = 48000
class Proxy(BaseHTTPRequestHandler):
def do_GET(self):
print("Method: GET")
url = self._resolve_url()
self.send_response(200)
self.end_headers()
headers = dict(self.headers)
headers['Host'] = HOST
resp = requests.get(url, headers=headers)
self.returnResponse(resp, headers)
def do_POST(self):
print("Method: POST")
url = self._resolve_url()
size = self.headers.get('Content-Length')
body = self.rfile.read(int(size))
headers = dict(self.headers)
headers['Host'] = HOST
resp = requests.post(url, data=body, headers=headers)
self.returnResponse(resp, headers)
def _resolve_url(self):
return self.path[1:]
def returnResponse(self, resp, headers):
self.send_response(resp.status_code)
for key in headers:
self.send_header(key, headers[key])
self.end_headers()
self.wfile.write(resp.content)
sys.exit(0)
if __name__ == '__main__':
server_address = ('', SERVER_PORT)
httpd = socketserver.ForkingTCPServer(server_address, Proxy)
print(f"Starting Proxy server on Port [{SERVER_PORT}]")
httpd.serve_forever()
사용 방법
요청 : http://{{proxy_server}}/http://{target_server_rest_api}}
Post의 경우 일반 REST API 사용처럼 사용하면 된다.
함수의 이름을 기반으로 POST, GET 요청을 처리한다.
원리
socketserver 모듈을 통해 요청 정보를 읽어, 대상의 서버에 보낼 수 있게 요청 정보를 수정한이후
수정한 정보로 대상의 서버에게 요청을 전달한다.
전달받은 결과를 읽어들여 그대로 본래의 요청 대상에게 전달한다.
POSTMAN을 통해 실험한 결과
Java로 만들어진 앱에서 데이터를 보내면서 Boolean타입이 달라 오류가 발생하는 문제도 있었다.
Python의 경우 True, Flase이지만 Java에서 보낸 데이터는 true, false
그리고 Python을 통해 Socket 통신을 하는 모듈을 문서를 보면서 작성하는데 발생한 오류들을 수정하느냐 시간이 꽤 걸렸다.
'💻Develop > 🐍Python' 카테고리의 다른 글
Traceback 가독성 높이기 (0) | 2023.05.24 |
---|