웹사이트 검색

Python HTTP 클라이언트 요청 - GET, POST


Python HTTP 모듈은 HTTP 및 HTTPS 프로토콜의 클라이언트 측을 제공하는 클래스를 정의합니다. 대부분의 프로그램에서 HTTP 모듈은 직접 사용되지 않으며 URL 연결 및 HTTP 요청과의 상호 작용을 처리하기 위해 urllib 모듈과 함께 사용됩니다. 오늘 우리는 Python HTTP 클라이언트를 사용하여 HTTP 요청을 실행한 다음 응답 상태를 구문 분석하고 응답 본문 데이터를 얻는 방법을 배웁니다.

파이썬 HTTP 클라이언트

Python HTTP 모듈에 대한 이 게시물에서는 연결을 시도하고 GET, POST 및 PUT과 같은 HTTP 요청을 시도합니다. 시작하자.

HTTP 연결 만들기

HTTP 모듈이 할 수 있는 가장 간단한 것부터 시작하겠습니다. 이 모듈을 사용하여 HTTP 연결을 쉽게 만들 수 있습니다. 다음은 샘플 프로그램입니다.

import http.client

connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)

파이썬 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()

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)
$ 

응답에서 헤더 목록 가져오기

수신한 응답에서 헤더에는 일반적으로 서버에서 다시 보낸 데이터 유형과 응답 상태에 대한 중요한 정보도 포함되어 있습니다. 응답 개체 자체에서 헤더 목록을 가져올 수 있습니다. 마지막 프로그램의 약간 수정된 버전인 코드 스니펫을 살펴보겠습니다.

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에 데이터를 게시하고 응답을 받을 수 있습니다. 다음은 샘플 프로그램입니다.

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 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 작업을 학습했습니다. API Doc을 사용하여 Python http 서버를 만들 수도 있습니다.