PythonのHTTPクライアントリクエスト – GET、POST
PythonのHTTPモジュールは、HTTPおよびHTTPSプロトコルのクライアント側を提供するクラスを定義しています。ほとんどのプログラムでは、HTTPモジュールは直接使用されず、urllibモジュールと組み合わせてURL接続とHTTPリクエストとのやり取りを処理します。今日はPythonのHTTPクライアントを使用してHTTPリクエストを送信し、レスポンスのステータスとレスポンスボディデータを取得する方法について学びます。
Pythonの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)

PythonのHTTP GET
では、URLからレスポンスとステータスを取得するためにHTTPクライアントを使用します。コードスニペットを見てみましょう。
import http.client
connection = http.client.HTTPSConnection("www.scdev.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.scdev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))

Pythonの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())

Pythonで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ドキュメント