CodeGym /コース /Python SELF JA /HttpClientの使用

HttpClientの使用

Python SELF JA
レベル 23 , レッスン 4
使用可能

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を使っているんだよ。それを正しく設定できるように、どうやって使うかを知っておく必要があるんだよ。

1
Опрос
シリアライズ,  23 уровень,  4 лекция
недоступен
シリアライズ
シリアライズ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION