Python 개발자가 요청을 좋아하는 이유

8488 단어 pythonhttptutorial
요청은 HTTP 클라이언트이며 제가 아는 모든 Python 개발자는 원격 소스에서 데이터를 가져와야 할 때 항상 도달합니다. PePy에 따르면 2021년 6월에만 1억 2100만 다운로드를 기록했으며 작성 당시 45.5k github 별을 보유하고 있습니다. 개발자는 Request로 요청하는 것을 좋아합니다!

2011년 Requests 최초 릴리스 당시 urllib3은 상위 수준 HTTP 라이브러리를 선택했으며 Requests는 실제로 이를 종속성으로 사용합니다. urllib3에 별이 2.7k에 불과하다는 점을 감안할 때 개발자가 Python이 몇 가지 코드 예제를 통해 요청 대신 요청을 선택하는 이유를 살펴보겠습니다.

urllib3 documentation에서 찾은 예제를 기반으로 하고 요청을 사용하여 각 예제를 다시 만듭니다.

GET 요청하기



urllib3:

import urllib3
http = urllib3.PoolManager()
resp = http.request("GET", "http://httpbin.org/robots.txt")
resp.status
200
resp.data
b'User-agent: *\nDisallow: /deny\n'


요청:

import requests

resp = requests.get("http://httpbin.org/robots.txt")

resp.status_code
200
res.text
'User-agent: *\nDisallow: /deny\n'


POST 요청하기(양식 데이터)



urllib3:

import urllib3

http = urllib3.PoolManager()
resp = http.request(
    "POST",
    "https://httpbin.org/post",
    fields={"hello": "world"}
)

print(resp.data)


요청:

import requests

resp = requests.post(
    "https://httpbin.org/post", 
  data={"hello": "world"}
)

print(res.text)


POST 요청하기(JSON 데이터)



urllib3:

import json
import urllib3

data = {"attribute": "value"}

# Encoding the data in JSON format.
encoded_data = json.dumps(data).encode("utf-8")

http = urllib3.PoolManager()
resp = http.request(
    "POST",
    "https://httpbin.org/post",
    body=encoded_data, # Embedding JSON data into request body.
    headers={"Content-Type": "application/json"}
)

json.loads(resp.data.decode("utf-8"))


요청:

import requests

resp = requests.post('https://httpbin.org/post', 
    json={"attribute": "value"}
)

resp.json()


urllib3와의 차이점



여기서 한 가지 분명한 차이점은 요청을 하기 위해 더 이상 PoolManager를 만들 필요가 없다는 것입니다. 각 스크립트에 대해 이것을 정의해야 하는 것은 지루할 수 있으므로 요청은 이를 제거합니다. 이상하게도 urllib3 docs state 이 작업을 수행하는 데 도움이 되는 최상위 urllib3.request()가 있지만 버전 1.26.6으로 테스트할 때 예제가 작동하지 않는 것 같습니다.

HTTP 메소드



여기서 주요 차이점은 간단하지만 궁극적으로 요청을 훨씬 더 쉽게 작업할 수 있게 해주는 HTTP 메서드 인터페이스입니다. 유한한 양HTTP request methods만 있으므로 클라이언트의 모든 기능일 수도 있습니다. 또한 작업하기에 매우 Pythonic하게 만듭니다. 이 URL에서 GET을 호출하고 싶기 때문에 URL을 .get()에 대한 인수로 제공합니다. 간단합니다. 알려진 메소드를 호출하여 메소드 유형을 인수로 제공하지 않는다는 점을 감안할 때 여기에서 실수의 가능성이 적습니다. urllib3와 비교할 때 코드를 매우 아름답게 단순하게 만드는 것은 이 인터페이스입니다.

내장 JSON 인코딩/디코딩



또 다른 차이점은 요청이 JSON 인코딩/디코딩을 처리한다는 것입니다. JSON 서비스와 대화할 때 우리가 많이 하게 될 일반적인 작업입니다. 모든 개발자가 작성하기에 충분히 간단하지만 라이브러리를 사용하는 모든 개발자가 스스로 해야 한다는 점을 감안할 때 성가신 일입니다. 우리 프로젝트를 어지럽히는 모든 utils.py 파일에는 몇 가지 기능이 적습니다. 결과적으로 최종 예제가 얼마나 더 단순해졌는지 보십시오. 모든 찌꺼기가 사라졌습니다!

결론



물론 다른 HTTP 클라이언트도 사용할 수 있으며 특정 사용 사례에 따라 더 적합할 수도 있습니다. 요청이 들어왔기 때문에 다른 라이브러리(예: asynchronous httpx )도 동일한 단순하고 우아한 API를 채택했습니다.

Requests는 Python용 HTTP 클라이언트 게임에서 확실히 승리했으며 우리는 Python을 제공하는 Requests가 아니더라도 친숙한 간단한 인터페이스를 더 오랫동안 사용할 것입니다.

좋은 웹페이지 즐겨찾기