5.1 HttpClientの紹介
Pythonには、多くのプログラミング言語と同様に、標準のHttpClientがあります。Pythonでは、これをhttp.client
と呼び、低レベルのHTTPリクエストを実行し、HTTPレスポンスを操作することができるんだ。HTTPサーバーへの接続を作成して、相互作用できるようにするよ。
http.client
のような低レベルのモジュールは、HTTP操作に対するより詳細な制御を提供するけど、その分、タスクを実行するのに多くのコードが必要なんだ。それに対して、requests
のような高レベルのモジュールは、多くの実装の詳細を隠しながら、よりシンプルなインターフェースを提供しているよ。
http.client
の基本機能
モジュールhttp.client
は次の基本的な機能を提供しているよ:
- HTTP接続の作成。
- HTTPリクエストの送信。
- HTTPレスポンスの読み取り。
- リクエストとレスポンスのヘッダーとボディの処理。
モジュールrequests
とは異なり、モジュールhttp.client
はより低レベルで、HTTPリクエストの動作の詳細に多くの注意が払われているんだ。
主なクラスとメソッドhttp.client
クラス/メソッド | 説明 |
---|---|
HTTPConnection |
HTTP接続の作成。 |
HTTPSConnection |
HTTPS接続の作成。 |
request(method, url, ...) |
HTTPリクエストの送信。 |
getresponse() |
リクエストのレスポンスを取得。 |
response.status |
レスポンスのステータスコード。 |
response.reason |
レスポンスステータスのテキスト説明。 |
response.read() |
レスポンスデータの読み取り。 |
response.getheaders() |
すべてのレスポンスヘッダーの取得。 |
response.getheader(name) |
特定のヘッダーの値の取得。 |
これらのいくつかを詳しく見ていこう。
5.2 GETリクエスト
の実行
http.client
ライブラリを使ってリクエストを実行するには、次の手順を行う必要があるよ:
接続を設定する
リクエストを送信する
レスポンスを取得する
接続を閉じる
使用後に接続を閉じることは、リソースの解放とメモリリークの防止のために必要だよ。これは特に多くのリクエストを扱うときや、長期間稼働するアプリケーションにおいては重要だね。
HTTPConnection
を使用した通常のHTTPリクエストの例:
import http.client
# HTTP接続の作成
conn = http.client.HTTPConnection("example.com")
# GETリクエストの送信
conn.request("GET", "/")
# レスポンスの取得
response = conn.getresponse()
print(response.status, response.reason)
# 接続の閉じる
conn.close()
HTTPSConnection
の使用例:
import http.client
# 接続の作成
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# GETリクエストの送信
conn.request("GET", "/posts/1")
# レスポンスの取得
response = conn.getresponse()
print(response.status, response.reason)
# レスポンスデータの読み取りとデコード
data = response.read().decode('utf-8')
print(data)
# すべてのレスポンスヘッダーの取得
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# 接続の閉じる
conn.close()
requests
を使った場合よりちょっと長いね、どうだい?
5.3 POSTリクエスト
の実行
POSTリクエスト
をhttp.client
を使って実行するのは、GETリクエスト
にとても似ているよ。ただ、データをjson文字列
に自分でパックしなければならないし、送信されるデータのタイプを手動で指定してContent-Type
ヘッダを追加する必要があるね。
例:
import http.client
import json
# POSTリクエストを送信する
conn.request("POST", "/posts", body=payload, headers=headers)
body
には、文字列にシリアライズされたjsonオブジェクト
を渡し、headers
には、データタイプの情報を含む辞書を渡す必要があるね。
例えば、こんな感じに見えるよ:
# 送信するデータ
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# ヘッダ – 送信されるコンテンツのタイプ
headers = {
'Content-Type': 'application/json'
}
これで、POSTリクエスト
の完全なコードはこうなるよ:
import http.client
import json
# 送信するデータ
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# ヘッダ
headers = {
'Content-Type': 'application/json'
}
# 接続の作成
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# POSTリクエストを送信する
conn.request("POST", "/posts", body=payload, headers=headers)
# レスポンスの取得
response = conn.getresponse()
print(response.status, response.reason)
# レスポンスデータの読み取りとデコード
data = response.read().decode('utf-8')
print(data)
# 接続の閉じる
conn.close()
5.4 リクエスト実行時のエラー処理
それから、エラー処理の例も示しておくといいと思うよ。これはrequests
の動作とは異なるんだ。http.client
モジュールでは、接続の問題や他のHTTPエラーがあった場合、例外が自動的に
発生するんだ。
例:
import http.client
try:
# 接続の作成
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# GETリクエストを送信する
conn.request("GET", "/posts/1")
# レスポンスの取得
response = conn.getresponse()
print(response.status, response.reason)
# レスポンスデータの読み取りとデコード
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("HTTPエラーが発生しました:", e)
except Exception as e:
print("エラーが発生しました:", e)
finally:
# 接続の閉じる
conn.close()
どうだろう?モジュールrequestsを使う方が簡単そうだよね。でもね!多くのモジュールやフレームワークは裏で低レベルのhttp.clientを使っているんだよ。それを正しく設定できるように、どうやって使うかを知っておく必要があるんだよ。
GO TO FULL VERSION