개요
2025.04.13-[Python] requests Transport Adapters - 요청 재시도에서 Python requests 모듈로 http 요청 재시도를 수행하는 멋진 방법을 살펴보았는데, 이 과정을 비동기 방식으로 수행하고 싶다. 하지만 requests 모듈은 비동기 프로그래밍을 지원하지 않는 것 같다.
관련해서 동기식, 비동기식 프로그래밍을 모두 지원하는 HTTPX라는 라이브러리가 있다는 것을 알게 되었다. 아주 기본적인 사용 방법을 적어둔다.
HTTPX
Python3용으로 설계된 HTTP 클라이언트로, 동기 및 비동기 API, 그리고 HTTP/1.1과 HTTP/2를 모두 지원한다.
공식 문서에 따르면 requests 라이브러리의 표준 기능 모두 지원하며, WSGI 또는 ASGI에 직접 요청할 수 있는 등의 특징을 가지고 있다.
(다만 동기 방식을 원하는 requests나 비동기 방식만 지원하는 aiohttp보다는 성능이 약간 아쉽다고 한다.)
참고로 Python 3.8 이상의 버전에서만 사용할 수 있다.
설치
당연히, 내장 라이브러리가 아니기 때문에 pip 등으로 설치할 필요가 있다.
pip install httpx
임포트
httpx는 다음과 같이 임포트하여 사용한다.
import httpx
요청
기본적인 요청 방법은 requests와 크게 다르지 않다. 각 메소드에 맞게 함수를 호출해주면 된다. POST 메서드의 경우에는 데이터 전달 시 data 매개변수를 사용한다.
import httpx
r = httpx.get('https://httpbin.org/get')
r = httpx.put('https://httpbin.org/put', data={'key': 'value'})
r = httpx.delete('https://httpbin.org/delete')
r = httpx.head('https://httpbin.org/get')
r = httpx.options('https://httpbin.org/get')
위 사진은 get 요청을 수행한 결과다.
쿼리 매개변수 전달
GET 요청 시 쿼리 매개변수를 전달할 때는 params 매개변수에 딕셔너리 형태로 전달하면 된다.
import httpx
params = {'key1': 'value1', 'key2': 'value2'}
r = httpx.get('https://httpbin.org/get', params=params)
print(r.url)
print(r)
요청 URL을 확인할 땐 url 속성을 확인하면 된다.
헤더
마찬가지로 헤더를 추가할 때는 headers 매개변수를 사용한다.
import httpx
headers = {'user-agent': 'my-app/0.0.1'}
params = {'key1': 'value1', 'key2': 'value2'}
r = httpx.get('https://httpbin.org/get', headers=headers, params=params)
응답
HTTPX는 기본적으로 응답을 유니코드 택스트로 자동 인코딩한다. 필요에 따라 text, content(바이트 응답), json 등으로 응답 데이터에 접근하면 된다.
import httpx
params = {'key1': 'value1', 'key2': 'value2'}
r = httpx.get('https://httpbin.org/get', params=params)
# text
print(r.text)
# bytes
print(r.content)
# json
print(r.json())
참고 문서
https://taejoone.jeju.onl/posts/2022-10-02-python-http-client-sync-async/