파이썬 HTTP 모듈은 HTTP 및 HTTPS 프로토콜의 클라이언트 측을 제공하는 클래스를 정의합니다. 대부분의 프로그램에서는 HTTP 모듈이 직접적으로 사용되지 않고 URL 연결 및 HTTP 요청과 상호 작용을 처리하기 위해 urllib
모듈과 함께 사용됩니다. 오늘은 파이썬 HTTP 클라이언트를 사용하여 HTTP 요청을 보내고 응답 상태를 구문 분석하고 응답 본문 데이터를 가져오는 방법을 배우겠습니다.
파이썬 HTTP 클라이언트
이 파이썬 HTTP 모듈 포스트에서는 GET, POST 및 PUT과 같은 연결 및 HTTP 요청을 시도해 보겠습니다. 시작해 봅시다.
HTTP 연결 생성
이 모듈이 할 수 있는 가장 간단한 작업부터 시작해 보겠습니다. 이 모듈을 사용하여 쉽게 HTTP 연결을 생성할 수 있습니다. 다음은 샘플 프로그램입니다:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
이 프로그램의 출력을 확인해 보겠습니다: 이 스크립트에서는 특정 시간 초과로 포트 80의 URL에 연결했습니다.
파이썬 HTTP GET
이제 HTTP 클라이언트를 사용하여 URL에서 응답과 상태를 가져올 것입니다. 코드 조각을 살펴보겠습니다:
import http.client
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
print("Status: {} and reason: {}".format(response.status, response.reason))
connection.close()
위 스크립트에서는 URL을 사용하고 연결 개체로 상태를 확인했습니다. 이 프로그램의 출력을 살펴보겠습니다: 연결 개체 사용이 끝나면 연결을 닫는 것을 잊지 마세요. 또한 이 웹 사이트가 HTTPS 프로토콜을 사용하여 제공되기 때문에
HTTPSConnection
을 사용하여 연결을 설정한 것에 주목하세요.
SSL: CERTIFICATE_VERIFY_FAILED 오류를 받았나요?
위 프로그램을 처음 실행했을 때 SSL 인증서와 관련된 다음과 같은 오류를 받았습니다.
$ python3.6 http_client.py
Traceback (most recent call last):
File "http_client.py", line 4, in <module>
connection.request("GET", "/")
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
context=self, session=session)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)
$
출력에서 SSL 인증서와 관련된 문제임을 알 수 있었습니다. 하지만 웹 사이트 인증서는 정상이므로 제 설정과 관련이 있을 것입니다. 구글링을 통해 MacOS에서는 이 문제를 해결하기 위해 Python 설치 디렉토리에 있는 Install Certificates.command
파일을 실행해야 한다는 것을 알아냈습니다. 아래 이미지는 이 명령 실행으로 생성된 출력을 보여주는데, SSL 연결을 만들 때 사용할 최신 인증서를 설치하는 것으로 보입니다. 참고로, 이 오류는 Mac OS에서 발생했습니다. 그러나 내 Ubuntu 시스템에서는 완벽하게 작동했습니다.

응답에서 헤더 목록 가져오기
우리는 일반적으로 응답에서 받은 헤더에도 서버로부터 전송된 데이터의 유형과 응답 상태에 관한 중요한 정보가 포함되어 있습니다. 우리는 응답 객체 자체에서 헤더 목록을 가져올 수 있습니다. 마지막 프로그램의 약간 수정된 버전인 다음 코드 스니펫을 살펴보겠습니다:
import http.client
import pprint
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))
이 프로그램의 출력을 확인해봅시다:
파이썬 HTTP POST
우리는 HTTP 모듈을 사용하여 URL로 데이터를 POST하고 응답을 받을 수도 있습니다. 다음은 샘플 프로그램입니다:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
이 프로그램의 출력을 확인해봅시다: 더 많은 요청을 시도해보기 위해 HTTP Bin 라이브러리를 자유롭게 사용해보세요.
파이썬 HTTP PUT 요청
물론, HTTP 모듈 자체를 사용하여 PUT 요청도 수행할 수 있습니다. 이전 프로그램을 사용할 것입니다. 코드 스니펫을 살펴보겠습니다:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)
이 프로그램의 출력을 확인해 봅시다:
결론
이 레슨에서는 http.client
를 사용하여 수행할 수 있는 간단한 HTTP 작업을 공부했습니다. 또한 SimpleHTTPServer 모듈을 사용하여 Python HTTP 서버를 생성할 수도 있습니다. 참고: API 문서
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post