Python

[Python] HTTPX - 비동기/동기 http 라이브러리

비번변경 2025. 5. 13. 01:56

개요

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://www.python-httpx.org/

https://taejoone.jeju.onl/posts/2022-10-02-python-http-client-sync-async/

 

 

728x90