[PyQt] Restful API를 이용한 express server와 http 통신

이정찬·2022년 5월 24일
0

PyQt

목록 보기
5/6
post-thumbnail

2021년 8월부터 2021년 11월까지 진행된 PyQt를 이용한 스마트팩토리 외주에서 배운 사항들을 정리하기 위해 작성한 글입니다.
Raspberry Pi 3 환경에 Raspbian OS를 설치하여 진행하였습니다.

1. requests 모듈 설치

python이 Restful API를 이용한 서버와 통신을 하기 위해서는 requests라는 외부 라이브러리가 필요합니다. 사용하시는 python 환경에 맞게, pip install requests 또는 conda install requests 로 라이브러리를 설치하고, import해서 사용해 줍니다.

여러 서버와 통신할 수 있지만, 이 포스팅에서는 Node.js 런타임에서 구축된 express 서버와 Restful API를 사용해 http통신을 하는 방법을 다룹니다. 방식이 Restful API이고, http 통신이라면, nginx나 Spring boot로 구현된 서버와도 통신이 가능합니다.

2. 코드 구현

모듈을 설치했다면, 코드 구현은 정말 간단합니다. API 명세서를 참조하여, 백엔드 개발자가 어떤 URL로 어떤 method를 이용하여 어떤 값을 받는지 확인합니다. 보통 json값을 보내게 되는데, 아래 코드처럼 작성해주시면 됩니다.

### machineStateUI.py
@QtCore.pyqtSlot(float, int, int, int)
def setValues(self, _vibe, _temperature, _humidity, _noise):
	...
    URL = config.URL + '/data'
	payload = { 
        'serial' : self.currentBarcode,
        'process': self.processNum,
        'data' : {
        	'noise' : _noise,
            'accel' : _vibe,
            'temp' : _temperature,
            'humi' : _humidity,
            'water_temp': 9999,
        },
    }
    res = requests.post(URL, json=payload)
    ...

pyqtSlot으로 받은 값들을 백엔드 서버로 보내는 코드입니다.

서버 URL은 유지보수 측면, 보안적인 측면에서 봤을 때 모두 다른 파일에 숨겨놓는 것이 좋습니다. 그렇게 하지 않은 상태에서 혹시 IP가 바뀐다면 모든 API 호출 코드를 수정해야 합니다. IP가 공개된 채로 github에 올라가게 된다면, 여러 공격을 받을 수도 있으니 조심해야 합니다.

그렇게 저장된 URL에 /data 라는 이름의 API로, post method를 이용하여 보낸다고 한다면,

res = requests.post(URL, json=payload)

코드를 입력하면 됩니다. json=payload가 의미하는 것은 default parameter로, 보내는 payload 값을 자동으로 json으로 파싱해서 보내줍니다. 만약, 여기서 json으로 정상적으로 변환되지 않는다면 에러를 반환합니다.
http headers를 지정하고 싶다면, headers={지정할 헤더 값}을 사용하고, query parameter를 이용하고 싶다면, params={지정할 query parameter 값}을 사용하여 호출해 줄 수 있습니다.

변수 res에는 response 객체가 들어오게 되는데, http 통신을 마치고 서버에서 보내주는 값에 따라 클라이언트에 띄울 에러 메세지나 상태창을 결정할 수 있습니다. 본 코드에서는 생략되었습니다.

3. 마치며

웹에서 보통 사용하는 fetch, axios와 비슷한 방식으로 api 호출을 구현할 수 있었습니다. API 명세서만 잘 받는다면 평소에 웹에서 구현하던 방식과 거의 동일하게 구현이 가능합니다.
오히려 훨씬 더 짧은 코드로 request와 response를 구현할 수 있었습니다.

profile
개발자를 꿈꾸는 사람

0개의 댓글