Python HTTPクライアントリクエスト – GET、POST

PythonのHTTPモジュールは、HTTPとHTTPSプロトコルのクライアント側を提供するクラスを定義しています。ほとんどのプログラムでは、HTTPモジュールは直接使用されず、URL接続やHTTPリクエストとのやり取りを処理するために urllib モジュールと組み合わせて使用されます。今日は、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)

このプログラムの出力を見てみましょう: このスクリプトでは、特定のタイムアウトでポート80のURLに接続しました。

Python 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ファイルを実行する必要があることをいくつかのGoogle検索で見つけました。以下の画像は、このコマンドの実行によって生成された出力を示しています。最新の証明書がSSL接続を行う際に使用されるようにインストールされているようです。 このエラーはMac OSで発生しましたが、Ubuntuシステムでは完全に機能しました。

Python HTTP Client 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))

このプログラムの出力を見てみましょう:

Python 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ライブラリを自由に使用してください。

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

Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post