강의자료 · 마이크로프로세서응용설계

센서 데이터를 제공하는 HTTP API

학습 목표

서버가 동작한다는 것과 요청을 올바르게 처리한다는 것은 다릅니다. 경로·누락 입력·안전한 응답을 먼저 시험합니다.

실행 조건

fastapi·httpx가 필요합니다. 브라우저 시험을 선택할 때만 uvicorn을 추가로 사용합니다.

필요한 패키지가 없으면 Colab·Jupyter 코드 셀에서 %pip install fastapi==0.162.0 httpx==0.28.1를 실행하세요.

요청을 함수로 시험하기

시작 조건

FastAPI의 /readings 경로에서 device와 start·end를 받습니다. TestClient는 실제 서버를 켜지 않고 요청을 보냅니다.

진행 방법

  1. 제공된 정상 요청을 실행하고 Status code와 JSON 필드를 확인하세요.
  2. start>end 요청을 실행하고 정상 응답과 구분하세요.

남길 결과

from fastapi import FastAPI,HTTPException
from fastapi.testclient import TestClient
app=FastAPI()
readings=[{'device':'m1','time_s':0.,'value':20.},{'device':'m1','time_s':1.,'value':21.}]
@app.get('/readings')
def get_readings(device:str,start:float=0,end:float=10):
    if start>end:raise HTTPException(status_code=400,detail='start must not exceed end')
    return [row for row in readings if row['device']==device and start<=row['time_s']<=end]
client=TestClient(app)
for query in ['/readings?device=m1','/readings?device=m1&start=2&end=1']:
    result=client.get(query);print(result.status_code,result.json())

결과 기록·자가 점검

요청:

Status code:

JSON의 핵심 필드:

확인할 점

잘못된 요청 구분하기

시작 조건

device 누락, start=abc, 없는 장치 m9, 존재하지 않는 /unknown 경로를 시험합니다.

진행 방법

  1. 네 요청의 Status code와 응답 본문을 표로 정리하세요.
  2. 없는 데이터와 잘못된 요청 중 어떤 경우를 빈 목록으로 처리할지 정하세요.
  3. 정상·오류 요청 두 개를 assert로 고정해 이후 수정 때 확인하세요.

남길 결과

for path in ['/readings','/readings?device=m1&start=abc','/readings?device=m9','/unknown']:
    response=client.get(path);print(path,response.status_code,response.json())
# TODO: 정상·오류 요청의 assert를 추가하세요.

결과 기록·자가 점검

요청:

Status code:

의미:

클라이언트의 다음 행동:

확인할 점

저장소와 연결하는 경계

시작 조건

이전 단원의 SQLite query 함수를 API 안에서 호출하려 합니다.

진행 방법

  1. 임시 목록에서 읽는 부분을 저장소 함수 호출로 바꾸는 위치를 표시하세요.
  2. API 입력 검증과 DB 조회 책임을 분리하세요.
  3. 응답 한 건에서 장치·시각·단위가 사용자가 해석할 만큼 명확한지 확인하세요.

남길 결과

# TODO: 이전 단원의 query(device,start,end)를 호출하도록 바꾸세요.
# 브라우저로 시험할 때만 로컬에서 uvicorn을 실행합니다.

결과 기록·자가 점검

구성요소:

받는 입력:

반환 값:

실패 처리:

확인할 점

공식 예제·데이터