PythonでAPI呼び出しを行う方法はいくつかあります。以下に4つの方法と、それぞれの方法のコード実例を紹介します。
1. requestsモジュールを使う方法
requestsモジュールは、PythonでHTTPリクエストを送信するためのライブラリです。requestsモジュールを使ってAPI呼び出しを行うには、以下のようにコードを記述します。
import requests url = "https://api.example.com/get_data" params = {'param1': 'value1', 'param2': 'value2'} headers = {'Authorization': 'Bearer my_token'} response = requests.get(url, params=params, headers=headers) if response.status_code == 200: data = response.json() # データを加工するなどの処理を行う else: print("Error: ", response.status_code)
上記の例では、requests.get()
メソッドを使用してAPI呼び出しを行っています。url
変数にAPIのエンドポイントのURLを、params
変数にAPIに送信するパラメータを、headers
変数には認証トークンなどのヘッダー情報を設定しています。
response
変数には、APIからのレスポンスが格納されます。status_code
属性を使って、レスポンスのステータスコードを確認することができます。200番台のステータスコードであれば、正常にAPI呼び出しを行ったことがわかります。レスポンスの内容は、json()
メソッドを使って取得することができます。
2. urllibモジュールを使う方法
urllibモジュールは、Pythonに標準で備わっているHTTPリクエストを送信するためのライブラリです。requestsモジュールと比較すると、少し書き方が複雑になりますが、Pythonに標準で備わっているため、インストールが不要なのがメリットです。
import urllib.request import urllib.parse import json url = "https://api.example.com/get_data" params = {'param1': 'value1', 'param2': 'value2'} headers = {'Authorization': 'Bearer my_token'} data = urllib.parse.urlencode(params).encode('utf-8') req = urllib.request.Request(url, data=data, headers=headers) with urllib.request.urlopen(req) as res: body = res.read().decode('utf-8') if res.status == 200: data = json.loads(body) # データを加工するなどの処理を行う else: print("Error: ", res.status)
上記の例では、urllib.request.urlopen()
メソッドを使用してAPI呼び出しを行っています。変数params
には、APIに送信するパラメータを格納します。headers
変数には認証トークンなどのヘッダー情報を設定しています。urlencode()
メソッドを使って、パラメータをURLエンコードしています。encode()
メソッドを使って、エンコードされたパラメータをバイト列に変換しています。
Request()
関数を使って、リクエストを作成し、urlopen()
メソッドを使ってリクエストを送信しています。with
ステートメントを使って、レスポンスを受け取り、read()
メソッドを使ってレスポンスボディを取得しています。decode()
メソッドを使って、バイト列を文字列に変換しています。
レスポンスのステータスコードを確認し、200番台のステータスコードであれば、json.loads()
メソッドを使ってレスポンスボディをJSONオブジェクトに変換しています。これにより、データを加工するなどの処理を行うことができます。
3. PyCurlモジュールを使う方法
PyCurlモジュールは、PythonでHTTPリクエストを送信するためのライブラリです。requestsやurllibよりも高速に動作することが特徴です。
import pycurl import json url = "https://api.example.com/get_data" params = {'param1': 'value1', 'param2': 'value2'} headers = ['Authorization: Bearer my_token'] data = json.dumps(params) c = pycurl.Curl() c.setopt(pycurl.URL, url) c.setopt(pycurl.HTTPHEADER, headers) c.setopt(pycurl.POSTFIELDS, data) c.setopt(pycurl.WRITEFUNCTION, lambda x: None) response = c.perform_rs() if c.getinfo(pycurl.RESPONSE_CODE) == 200: data = json.loads(response) # データを加工するなどの処理を行う else: print("Error: ", c.getinfo(pycurl.RESPONSE_CODE))
上記の例では、pycurl.Curl()
オブジェクトを作成し、setopt()
メソッドを使って、API呼び出しに必要な情報を設定しています。URL
オプションにAPIのエンドポイントのURLを、HTTPHEADER
オプションに認証トークンなどのヘッダー情報を、POSTFIELDS
オプションにAPIに送信するデータを設定しています。
WRITEFUNCTION
オプションには、レスポンスボディを受け取るための関数を設定しています。ここでは、lambda式を使って、レスポンスボディを受け取らないようにしています。これは、PyCurlがレスポンスボディを自動的にstdout
に出力するためです。
perform_rs()
メソッドを使って、リクエストを送信し、レスポンスを受け取っています。レスポンスのステータスコードを確認し、200番台のステータスコードであれば、json.loads()
メソッドを使ってレスポンスボディをJSONオブジェクトに変換しています。
4. aiohttpモジュールを使う方法
aiohttpモジュールは、Python 3.5以降で利用可能な非同期HTTPクライアントおよびサーバーライブラリです。非同期I/Oを使用するため、リクエストの処理が高速に行われることが特徴です。
import aiohttp import asyncio import json async def fetch(session, url, headers, data): async with session.post(url, headers=headers, data=data) as response: if response.status == 200: return await response.json() else: print("Error: ", response.status) async def main(): url = "https://api.example.com/get_data" params = {'param1': 'value1', 'param2': 'value2'} headers = {'Authorization': 'Bearer my_token'} data = json.dumps(params) async with aiohttp.ClientSession() as session: result = await fetch(session, url, headers, data) # データを加工するなどの処理を行う loop = asyncio.get_event_loop() loop.run_until_complete(main())
上記の例では、aiohttp.ClientSession()
を作成し、post()
メソッドを使ってAPI呼び出しを行っています。async with
ステートメントを使って、セッションを作成し、リクエストを送信しています。
fetch()
関数は、リクエストを送信し、レスポンスを受け取るための非同期関数です。post()
メソッドの戻り値であるresponse
オブジェクトを使って、レスポンスのステータスコードを確認し、200番台のステータスコードであれば、json()
メソッドを使ってレスポンスボディをJSONオブジェクトに変換しています。
main()
関数では、async with
ステートメントを使って、セッションを作成し、fetch()
関数を呼び出しています。asyncio.get_event_loop()
関数を使って、イベントループを取得し、run_until_complete()
メソッドを使って、イベントループを開始しています。
まとめ
PythonでAPI呼び出しを行う方法についていくつかの方法を紹介しました。まず、requests
ライブラリを使う方法を紹介しました。この方法は、HTTPリクエストの送信やレスポンスの受信が簡単に行えるという利点がありますが、外部ライブラリであるため、インストールが必要であるという欠点があります。
次に、標準ライブラリのurllib.request
モジュールを使う方法を説明しました。この方法は、Pythonが標準で提供しているHTTPクライアントであるため、簡単に使えるという利点がありますが、コードが長くなりやすいという欠点があります。
また、pycurl
モジュールを使う方法を紹介しました。この方法は、非同期I/Oに対応していないため、シングルスレッドでの処理が行われるという欠点がありますが、高速なリクエストの送信が可能であるという利点があります。
最後に、aiohttp
モジュールを使う方法を紹介しました。この方法は、非同期I/Oに対応しているため、高速なリクエストの送信が可能であるという利点がありますが、非同期処理のコードを書く必要があるという欠点があります。
それぞれの方法には、利点と欠点があります。使用する場合は、APIの仕様やプロジェクトの要件に合わせて最適な方法を選択する必要があります。また、これらのプログラムはPythonの基本的な文法とライブラリで実装することができます。Pythonの基礎学習には下記のようなサイトの利用が有効です。