kosmo138 / resumate

자기소개서를 세상에서 가장 쉽게 쓰는 방법
https://www.resumate.store
0 stars 0 forks source link

FastAPI: GET /api/resume 요청 시 오류 #85

Closed suyons closed 7 months ago

suyons commented 7 months ago

관련 이슈

67

문제 상황

FastAPI에서 GET http://localhost/api/resume 요청 시 다음과 같은 오류가 발생했다.

def get_resume_by_id(authorization: str, letter: Letter) -> str:
    ...
    response = requests.get(
        f"http://localhost/api/resume/{letter.resume_id}", headers=headers
    )
    ...
HTTPConnectionPool(host='localhost', port=80): Max retries exceeded with url: /api/resume/1 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xffff9daacf80>: Failed to establish a new connection: [Errno 111] Connection refused'))

해결 1

pip를 통해 다운로드한 requests 모듈 대신 파이썬 내장 모듈인 urllib를 적용해 보았으나 도움이 되지는 않았다.

url: str = f"http://localhost/api/resume/{letter.resume_id}"
headers: dict = {"Authorization": authorization}
req = request.Request(url=url, headers=headers)
with request.urlopen(req) as response:
    if response.status == 200:
        return response.read().decode("utf-8")
    else:
        raise HTTPException(
            status_code=response.status, detail="이력서 정보 조회 실패"
        )
urllib.error.URLError: <urlopen error [Errno 99] Cannot assign requested address>

해결 2

Google에서 검색을 해 보았으나 해결에 도움되는 정보가 없어 나만의 use case에서 발생하는 문제라고 판단했다.

컨테이너 내부의 /etc/hosts 파일에는 당연히 localhost = 127.0.0.1로 기록되어 있을 것이고 이는 data 컨테이너 자기 자신을 가리키는 것이라 생각했다. data 컨테이너 외부의 부모 호스트에 접근하기 위해서는 localhost 대신 host.docker.internal을 입력해야 한다고 생각했다.

따라서 GET 요청 부분을 다음과 같이 수정했다.

url: str = f"http://host.docker.internal/api/resume/{letter.resume_id}"
headers: dict = {"Authorization": authorization}
response = requests.get(url=url, headers=headers)

다음과 같이 POST /data/letter 요청에 대한 응답이 정상적으로 출력되었다.

image

참고 문서

Explore networking features on Docker Desktop | Docker Docs

suyons commented 7 months ago

Close #85