https://d226lax1qjow5r.cloudfront.net/blog/blogposts/3-ways-to-make-http-calls-with-python-requests-beginner-to-advanced/3-levels_http-calls_python.png

PythonリクエストでHTTPコールをする3つの方法(初心者から上級者まで)

最終更新日 October 4, 2023

所要時間:1 分

HTTP リクエストを行う機能は、アプリケーションがウェブとやりとりするのに不可欠です。Python を使っているのであれば、Web スクレイパーを作ったり、RESTful API を利用したり、あるいは他の方法で Web とやり取りする必要があるにせよ、Python のサードパーティ Requests モジュールは最も人気があり、使いやすいオプションです。この投稿では、Requestsモジュールを使ってHTTPリクエストの3つのレベルを探求し、基本から始めて高度なテクニックへと発展させていきます。最後には、本番で Requests を使えるようになるでしょう!

この投稿の高レベルのコード例は Vonage Python SDKメッセージング、Voice、Video、2要素認証などのAPIを呼び出すことができるSDKです。私たちはこれらすべてを行うために Requests モジュールを利用しているので、Requests を使うための完璧なサンプルプロジェクトです。

リクエストゲームのレベルアップを図ろう。レベル1から始めよう...今すぐに!

レベル1:基本的なHTTPリクエスト

基本的なレベルでは、基本的な HTTP リクエストがあります。これらは Web サービスとやりとりする必要のある Python 開発者の糧となるものです。Requests モジュールを使うと GET や POST リクエストを驚くほど簡単に実行でき、Web ページを取得したりデータをサーバーに送信したりするのが簡単になります。

まず、お好きな仮想環境にリクエストをインストールします:

python3 -m venv venv-requests-vonage . ./venv-requests-vonage/bin/activate pip install -U pip requests

仮想環境を有効にし、Requestsをインストールしたら、すぐに使い始めることができる。Webページの内容を取得するGETリクエストの例です:

import requests

response = requests.get('https://example.com')
print(response.text)

上記のコードを実行すると、ページのHTML全体が表示されます。 https://example.comページ全体が表示されます。しかし、リクエストでウェブページを取得するだけではありません!

これはPOSTリクエストで、データをURLに送信する:

import requests

data = {'vonage': 'loves', 'python': '!'}
response = requests.post('https://httpbin.org/post', json=data)
print(response.json())

Python辞書にシリアライズされたレスポンスを以下に示す。私たちが投稿したデータが含まれていることに注意してください:

{'args': {}, 'data': '{"vonage": "loves", "python": "!"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '34', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65012480-007aeecf146f5ff007c7678d'}, 'json': {'python': '!', 'vonage': 'loves'}, 'origin': '82.30.197.62', 'url': 'https://httpbin.org/post'}

これらの簡単な例で、あなたはすでにPythonでHTTPリクエストを始めることができます。しかし、複数のリクエストにまたがって設定を持続させたり、リソースを共有したりする必要がある場合はどうするのでしょうか?そこでレベル2の登場です!

レベル2:永続化のためのセッションの使用

HTTPセッションは、同じサーバーへの複数のリクエストにわたって設定を永続化する方法です。また、セッションはコネクション・プーリングを使用します。つまり、同じホストに対して複数のHTTPコールを行うと、同じリソースを使用することになり、パフォーマンスが大幅に向上します!

このどちらかに当てはまるなら、セッションを利用したほうがいいかもしれない:

  • 認証されたAPIやウェブ・アプリケーションを扱う場合など、ステートフルな接続を維持する必要がある場合。

  • 同じAPI/ホストへのリクエストが多く、時間とリソースを無駄にしたくない場合。

Requestsモジュールはそれを可能にするSessionオブジェクトを提供します。以下はその例です:

import requests

# Create a session
session = requests.Session()

# Set headers to be sent in every request
session.headers.update({'Accepts': 'application/json'})

# Perform multiple requests within the same session
response1 = session.get('https://example.com/some-page')
response2 = session.get('https://example.com/some-other-page')

このようにセッションを使うことは、私たちが設定したすべてのクッキーが永続化されることを意味します。また、上記で送信したヘッダで行ったように、セッションオブジェクトにデフォルト値を追加することで、セッションのデフォルト値を設定することもできます。これは非常に便利ですが、Vonage Python SDKでSessionオブジェクトを使う主な理由は、ユーザが多くのAPIコールを非常に素早く行えるようにするためです。

HTTPセッションを使用することによるパフォーマンスの利点の例です。以下のコードではセッションを使用せず、Vonageの Number Insight APIに100回のAPIコールを行っています。を100回呼び、100種類の電話番号の情報を調べ、国際E.164フォーマットに変換しています:

import requests
import time

start_time = time.perf_counter()

number_conversions = {}
params = {'api_key': 'MY_API_KEY', 'api_secret': 'MY_API_SECRET', 'country': 'GB'}

for i in range(100):
    phone_number = str(1614960100 + i)
    params['number'] = phone_number
    
    with requests.get(
        'https://api.nexmo.com/ni/basic/json',
        params=params,
    ) as response:
        number_conversions[phone_number] = response.json()[
            'international_format_number'
        ]

elasped_time = time.perf_counter() - start_time
print(f'Time elapsed is: {elasped_time} seconds.')

次のような出力が得られる: Time elapsed is: 11.103735665994463 seconds.100のAPIコールを実行するのに11秒以上かかっている。

上のコードをプロファイリングしました。 スネークビズ:

An icicle plot showing how much time was spent executing each part of the program for the vanilla requests caseVanilla requests icicle plot

ほとんどの時間(10/11秒以上)をコネクション・プーリングに費やしていることがわかる。セッションを使用して、複数のHTTPコールが共通のコネクション・プーリングを使用し、リソースを共有できるようにすれば、この時間を短縮できるはずだ。見てみよう。

Number Insight APIの呼び出しにセッションオブジェクトを使用すると、その違いがわかる:

with requests.Session() as session:

    for i in range(100):
        phone_number = str(441614960100 + i)
        params['number'] = phone_number
    
        with session.get(
            'https://api.nexmo.com/ni/basic/json',
            params=params,
        ) as response:
            number_conversions[phone_number] = response.json()[
                'international_format_number'
            ]

今度はこんな出力が得られる: Time elapsed is: 4.058261167003366 seconds.これはほぼ3倍速い!私たちのシステムがコネクション・プーリングに費やした時間は比例して少なく、使用された時間は、上記のように100のリクエストを別々に行った場合よりもはるかに効率的に費やされたことが、このプログラムのつららプロットでわかります。

An icicle plot showing how much time was spent executing each part of the program for the case where we use a session object with RequestsSession requests case icicle plot

セッションを使うことで、クッキーやヘッダを自動的に扱うことができ、コードがよりクリーンで効率的になることがわかります。しかし、HTTPリクエストをさらに制御する必要があったり、接続を微調整したい場合はどうすればいいでしょうか?レベル3の出番です。

レベル3:高度な設定のためのHTTPアダプタの活用

ここでは、コネクションプーリングや再試行などの設定を含め、HTTP リクエストの振る舞いを非常に低いレベルでカスタマイズします。この HTTP アダプタを Session オブジェクトにマウントすることで、 セッション全体でカスタム設定を使用することができます。Requests では HTTPAdapterというオブジェクトを使います。

以下は HTTPAdapterオブジェクトを使ってカスタム設定を行う方法を説明します:

import requests
from requests.adapters import HTTPAdapter

session = requests.Session()

# Create an HTTPAdapter object and configure connection pooling and retries
adapter = HTTPAdapter(pool_connections=20, pool_maxsize=5, max_retries=3)

# Mount the HTTPAdpater object to the session
session.mount('https://', adapter)

response = session.get('https://example.com')

これはまた、タイムアウトのようなリクエスト固有の値 (例えば session.get('https://example.com', timeout=10)) と組み合わせて、リクエストごとにきめ細かく制御することもできます。

HTTP アダプタを使用すると、HTTP リクエストの作成方法を制御できるため、特定の要件に合わせてアプリケーションの動作を微調整できます。

ボーナス:適切なPython SDKの使用

Vonage の Python SDKでは、最も効果的な方法でリクエストを送信するために、これらのテクニックをすべて利用しています。セッションを使用し、ユーザが Clientオブジェクトを作成するときに、リクエストと HTTP アダプタの設定を行えるようにしています。以下のコードは、上記と同じリクエストを実行し、100 Number Insight API 呼び出しを行う方法を示していますが、今回は Vonage Python SDK を使用して呼び出しを行います。

import vonage

client = vonage.Client(key='MY_API_KEY', secret='MY_API_SECRET')
number_conversions = {}

for i in range(100):
    phone_number = str(1614960100 + i)
    response = client.number_insight.get_basic_number_insight(
        country='GB', number=phone_number
    )
    number_conversions[phone_number] = response['international_format_number']

のようなデフォルトをカスタマイズしたい場合は、次のようにしてください。 pool_connectionsやリクエスト timeoutオブジェクトを作成するときに指定できます。 clientオブジェクトを作成するときに指定できます。

Vonage APIを呼び出すためにVonage SDKを使用する利点は、リクエストロジックについて心配する必要がないことです。あなたが何をしたいかを指定し、SDKがあなたのためにそれを世話します。他の多くのサービスも同じようにSDKを持っており、あなたにとって重要でないかもしれないロジックを抽象化しています。

まとめ

このブログポストでは、Python の Requests モジュールを使って、基本的なリクエストからセッションや HTTP アダプタを使った高度なカスタマイズまで、HTTP リクエストの 3 つのレベルについて説明しました。これらのレベルをマスターすることで、Python プロジェクトで Web 関連の幅広いタスクに取り組めるようになります。

各レベルは前のレベルの上に構築されるので、基本的なことから始めて、 プロジェクトの要求が進化するにつれて徐々にレベルアップしていくことを覚えておいてください。HTTP リクエストはウェブ開発の基本的な側面であり、 Requests モジュールを使うことで、それらを効果的に処理するための強力なツールを自由に使えるようになります。

Vonage API の使用を開始したい場合は、次のことが可能です。 無料の開発者アカウントにサインアップする(無料クレジット付き!)

この記事についてご質問がある場合は、お気軽に私たちの VonageコミュニティSlackにてご質問ください。 X(以前はTwitterと呼ばれていました)上でメッセージをお送りください。.

さあ、さまざまなレベルのHTTPリクエストを試して、あなたのPythonアプリケーションをプロのようにウェブとやり取りできるようにしよう!

シェア:

https://a.storyblok.com/f/270183/400x400/92109caf6a/max-kahan.png
Max KahanVonage 元チームメンバー

マックスはPythonデベロッパー・アドボケイトであり、通信API、機械学習、デベロッパー・エクスペリエンス、ダンスに興味を持つソフトウェア・エンジニアだ!物理学を専攻していたが、現在はオープンソースのプロジェクトに携わり、開発者の生活をより良くするためのものを作っている。