- Day 48:API入門 ― 「サービス同士の会話」をPythonでのぞいてみる
- APIとは:サービス同士が「手をつなぐための窓口」
- REST APIとは:HTTPを使った「シンプルなAPIのスタイル」
- JSONとは:APIの世界の「共通語」
- APIレスポンスとは:サーバーからの「返事のパッケージ」
- 実際にREST風APIを叩いてみる:GET+JSONの基本
- パラメータ付きAPI呼び出し:特定のデータだけを取得する
- APIレスポンスを「安全に」扱うための基本パターン
- Day 48ミニテンプレート:API入門用の「GETクライアント」
- Day 48のまとめ
- Day 48:APIデータ取得ツールを作りながらAPI入門を深める
- APIとは:サービス同士が「データをやり取りするための窓口」
- REST APIとは:HTTPを使った「シンプルなAPIのスタイル」
- JSONとは:APIの世界の「共通語」
- APIレスポンスとは:サーバーからの「返事のパッケージ」
- APIデータ取得ツールの設計:何をどう作るか
- ステップ1:requestsで基本のGETを行う
- ステップ2:JSONレスポンスを辞書・リストとして扱う
- ステップ3:クエリパラメータ対応のAPIデータ取得ツールにする
- ステップ4:APIレスポンスを「安全に」扱うための考え方
- Day 48のまとめ
Day 48:API入門 ― 「サービス同士の会話」をPythonでのぞいてみる
Day 48では、いよいよ API という言葉の正体に踏み込んでいきます。 ここまででHTTPやrequestsの基本は押さえたので、今日はそれを「サービス同士の会話」という視点で見ていくイメージです。
テーマは次の4つです。
- APIとは
- REST API
- JSON
- APIレスポンス
ひとつひとつ、肩の力を抜きながら、でも中身はちゃんと本格的に見ていきます。
APIとは:サービス同士が「手をつなぐための窓口」
人間向けの画面ではなく、「プログラム向けの入り口」
まずは「APIとは何か」を、ざっくりしたイメージから。
APIは、ひと言でいうと 「プログラム同士がやり取りするための窓口」 です。
- 人間向けの画面:Webサイト、スマホアプリのUI
- プログラム向けの窓口:API
という感じで、役割が分かれています。
例えば:
- 天気予報サービスのAPI
- 為替レートのAPI
- 社内システムの顧客情報API
などがあり、Pythonからそれらにアクセスすると、
「今日の東京の天気教えて」 「USD/JPYのレート教えて」 「顧客ID123の情報教えて」
といったお願いを、プログラムの言葉で送ることができます。
REST APIとは:HTTPを使った「シンプルなAPIのスタイル」
URL+HTTPメソッドで操作を表現する
APIにもいろいろな種類がありますが、 今いちばんよく使われているのが REST API と呼ばれるスタイルです。
REST APIの特徴は、ざっくり言うと:
- HTTPを使う(GET・POST・PUT・DELETEなど)
- URLで「どのリソース(データ)を扱うか」を表現する
- JSONでデータをやり取りすることが多い
というシンプルなルールに従っていることです。
例えば、ユーザー情報を扱うREST APIなら、こんな感じのURLがよく出てきます。
GET /users→ ユーザー一覧を取得GET /users/123→ IDが123のユーザーを取得POST /users→ 新しいユーザーを作成PUT /users/123→ IDが123のユーザー情報を更新DELETE /users/123→ IDが123のユーザーを削除
Pythonから見ると、
「このURLにGETすると一覧が返ってくる」 「このURLにPOSTすると新規登録される」
という「決まりごと」があるAPI、というイメージでOKです。
JSONとは:APIの世界の「共通語」
辞書とリストの組み合わせに近いデータ形式
APIの世界では、データのやり取りに JSON がほぼ標準で使われています。
JSONは、ざっくり言うと:
- キーと値のセット(辞書のようなもの)
- 値の並び(リストのようなもの)
を組み合わせたデータ形式で、Pythonの dict や list と相性がとても良いです。
JSONの例をひとつ見てみましょう。
{
"user_id": 123,
"name": "Taro",
"tags": ["premium", "email_verified"],
"profile": {
"age": 30,
"city": "Tokyo"
}
}
JSONPythonでいうと、ほぼそのまま辞書+リストの形ですね。
APIレスポンスとは:サーバーからの「返事のパッケージ」
ステータスコード+ヘッダー+ボディ(中身)
APIにリクエストを送ると、サーバーから レスポンス が返ってきます。 これは、次の3つの要素で構成されています。
- ステータスコード
- 成功か失敗か、その理由を表す番号(200, 404, 500など)
- ヘッダー
- 追加情報(レスポンスの形式、長さ、サーバー情報など)
- ボディ(本文)
- 実際のデータ(JSONなど)が入っている部分
PythonのrequestsでAPIを叩くときは、
response.status_coderesponse.headersresponse.text/response.json()
あたりをよく使うことになります。
実際にREST風APIを叩いてみる:GET+JSONの基本
ここからは、実際にPythonコードでAPIレスポンスを扱う流れを見ていきます。 練習用に便利な https://jsonplaceholder.typicode.com というサービスを使います。
例:投稿一覧を取得するAPI
# day48_api_get_posts.py
import requests # HTTP通信を簡単にしてくれるライブラリです。
def get_posts():
"""REST風APIから投稿一覧を取得する例です。"""
# アクセスしたいAPIのURLです。
url = "https://jsonplaceholder.typicode.com/posts"
# GETリクエストを送ります。
response = requests.get(url)
# ステータスコードを確認します。
print("ステータスコード:", response.status_code)
# 成功(200番台)のときだけ中身を処理します。
if 200 <= response.status_code < 300:
# JSONとしてレスポンスを解釈します。
posts = response.json() # ここでPythonのリスト+辞書の形になります。
print("投稿件数:", len(posts))
# 先頭の投稿だけ表示してみます。
first = posts[0]
print("最初の投稿:")
print("ID:", first.get("id"))
print("タイトル:", first.get("title"))
print("本文:", first.get("body"))
else:
print("取得に失敗しました。レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_posts()
Pythonここでのポイントは:
response.json()で、JSONレスポンスをPythonのオブジェクトに変換していること。- 返ってきたデータが「リスト(複数件)」+「辞書(1件の詳細)」の組み合わせになっていること。
- ステータスコードをチェックしてから中身を扱う習慣をつけること。
パラメータ付きAPI呼び出し:特定のデータだけを取得する
例:ユーザーIDで絞り込む
多くのAPIは、「クエリパラメータ」で絞り込み条件を指定できます。 例えば、userId=1 の投稿だけ欲しい、というようなケースです。
# day48_api_get_filtered.py
import requests
def get_posts_by_user(user_id: int):
"""特定ユーザーの投稿だけを取得する例です。"""
url = "https://jsonplaceholder.typicode.com/posts"
# クエリパラメータを辞書で指定します。
params = {
"userId": user_id
}
# パラメータ付きでGETリクエストを送ります。
response = requests.get(url, params=params)
print("ステータスコード:", response.status_code)
print("実際にアクセスしたURL:", response.url)
if 200 <= response.status_code < 300:
posts = response.json()
print(f"userId={user_id} の投稿件数:", len(posts))
# 先頭の投稿だけ表示してみます。
if posts:
first = posts[0]
print("最初の投稿タイトル:", first.get("title"))
else:
print("取得に失敗しました。レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_posts_by_user(1)
Pythonポイント:
params=に辞書を渡すことで、URLに?userId=1のようなクエリパラメータが自動で付与されます。response.urlを見ると、「最終的にどんなURLでアクセスしたか」が確認できます。
APIレスポンスを「安全に」扱うための基本パターン
APIを扱うときに、初心者の方にもぜひ身につけてほしい「安全な書き方」があります。
1. ステータスコードを必ずチェックする
status = response.status_code
if 200 <= status < 300:
# 成功時の処理
else:
# 失敗時の処理
Pythonこれを入れておくだけで、
- ネットワークエラー
- 認証エラー
- サーバー側のエラー
などに対して、落ち着いて対処しやすくなります。
2. JSONの形を意識して扱う
レスポンスがJSONの場合、
- 「リスト(複数件)」なのか
- 「辞書(1件の詳細)」なのか
を意識して扱うことが大事です。
例えば、投稿一覧ならリスト、 ユーザー詳細なら辞書、というようにAPIごとに形が違います。
Day 48ミニテンプレート:API入門用の「GETクライアント」
最後に、Day 48の内容をまとめた、 「REST風APIを叩くための小さなGETクライアント」テンプレート を紹介します。
# day48_api_client_template.py
import requests
def get_api_json(
url: str,
params: dict | None = None,
) -> dict | list | None:
"""
シンプルなAPIクライアント関数です。
- URLにGETでアクセスします。
- 必要に応じてクエリパラメータを付けます。
- 成功したらJSONをPythonのオブジェクトとして返します。
"""
print(f"[GET] {url} にアクセスします。")
# GETリクエストを送ります。
response = requests.get(url, params=params)
print("ステータスコード:", response.status_code)
# 成功(200番台)のときだけJSONを返します。
if 200 <= response.status_code < 300:
try:
data = response.json()
print("JSONを受け取りました。")
return data
except ValueError:
print("JSONとして解釈できませんでした。レスポンス本文:")
print(response.text)
return None
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
return None
def main():
# 投稿一覧を取得する例
url_posts = "https://jsonplaceholder.typicode.com/posts"
posts = get_api_json(url_posts)
if isinstance(posts, list):
print("投稿件数:", len(posts))
if posts:
print("最初の投稿タイトル:", posts[0].get("title"))
# 特定ユーザーの投稿だけ取得する例
url_posts = "https://jsonplaceholder.typicode.com/posts"
posts_user1 = get_api_json(url_posts, params={"userId": 1})
if isinstance(posts_user1, list):
print("userId=1 の投稿件数:", len(posts_user1))
if __name__ == "__main__":
main()
Pythonこのテンプレートは、
- URLとパラメータを渡すと、JSONレスポンスをPythonのオブジェクトとして返してくれる
- ステータスコードをチェックして、成功時だけJSONを扱う
という、API入門にちょうどいい形になっています。
Day 48のまとめ
Day 48では、API入門として、
- APIは「プログラム同士がやり取りするための窓口」であること
- REST APIは、HTTP+URL+メソッド(GET/POSTなど)でシンプルにデータを扱うスタイルであること
- JSONは、APIの世界の「共通語」であり、Pythonの辞書・リストと相性が良いこと
- APIレスポンスは、ステータスコード+ヘッダー+ボディ(JSONなど)で構成されていること
- requestsを使って、REST風APIからJSONレスポンスを取得し、Pythonのオブジェクトとして扱う基本パターン
を、コード例とともに整理しました。
ここから先は、
- 実際の公開API(天気・ニュース・為替など)
- 社内システムのAPI
- 自分で作る簡単なAPIサーバー
と組み合わせて、 「Pythonで外の世界とつながる」感覚を、どんどん広げていくことができます。
Day 48:APIデータ取得ツールを作りながらAPI入門を深める
Day 48では、単なる「APIとは?」の説明にとどまらず、 実際に APIデータ取得ツール を作りながら、APIの基本を体に馴染ませていきます。
テーマは次の4つです。
- APIとは
- REST API
- JSON
- APIレスポンス
これらを、1本の「データ取得ツール」という形にまとめていく流れで、 初心者の方にも分かりやすくステップバイステップで説明していきます。
APIとは:サービス同士が「データをやり取りするための窓口」
人間向けの画面ではなく、プログラム向けの入り口
APIは、ひと言でいうと 「プログラム同士がやり取りするための窓口」 です。
- 人間向けの画面:Webサイト、スマホアプリのUI
- プログラム向けの窓口:API
という役割分担になっていて、 PythonからAPIにアクセスすると、
- 「今日の天気を教えて」
- 「このユーザーの情報を教えて」
- 「この商品一覧をJSONで返して」
といったお願いを、プログラムの言葉で送ることができます。
ここで大事なのは、
APIは「人が見る画面」ではなく、「プログラムが話しかける窓口」
というイメージを持つことです。
REST APIとは:HTTPを使った「シンプルなAPIのスタイル」
URL+HTTPメソッドで操作を表現する
APIにもいろいろな種類がありますが、 今いちばんよく使われているのが REST API と呼ばれるスタイルです。
REST APIの特徴は、ざっくり言うと次の通りです。
- HTTPを使う(GET・POST・PUT・DELETEなど)
- URLで「どのリソース(データ)を扱うか」を表現する
- JSONでデータをやり取りすることが多い
例えば、ユーザー情報を扱うREST APIなら、こんな感じのURLがよく出てきます。
GET /users→ ユーザー一覧を取得GET /users/123→ IDが123のユーザーを取得POST /users→ 新しいユーザーを作成PUT /users/123→ IDが123のユーザー情報を更新DELETE /users/123→ IDが123のユーザーを削除
Pythonから見ると、
「このURLにGETすると一覧が返ってくる」 「このURLにPOSTすると新規登録される」
という「決まりごと」があるAPI、というイメージでOKです。
JSONとは:APIの世界の「共通語」
辞書とリストの組み合わせに近いデータ形式
APIの世界では、データのやり取りに JSON がほぼ標準で使われています。
JSONは、ざっくり言うと:
- キーと値のセット(辞書のようなもの)
- 値の並び(リストのようなもの)
を組み合わせたデータ形式で、Pythonの dict や list と相性がとても良いです。
JSONの例をひとつ見てみましょう。
{
"user_id": 123,
"name": "Taro",
"tags": ["premium", "email_verified"],
"profile": {
"age": 30,
"city": "Tokyo"
}
}
JSONPythonでいうと、ほぼそのまま辞書+リストの形ですね。
APIデータ取得ツールでは、このJSONを Pythonの辞書・リストとして扱う ことが重要なポイントになります。
APIレスポンスとは:サーバーからの「返事のパッケージ」
ステータスコード+ヘッダー+ボディ(中身)
APIにリクエストを送ると、サーバーから レスポンス が返ってきます。 これは、次の3つの要素で構成されています。
- ステータスコード
- 成功か失敗か、その理由を表す番号(200, 404, 500など)
- ヘッダー
- 追加情報(レスポンスの形式、長さ、サーバー情報など)
- ボディ(本文)
- 実際のデータ(JSONなど)が入っている部分
PythonのrequestsでAPIを叩くときは、
response.status_coderesponse.headersresponse.text/response.json()
あたりをよく使うことになります。
APIデータ取得ツールでは、
- ステータスコードをチェックする
- 成功していればJSONを取り出す
- 失敗していればエラーメッセージを表示する
という流れが基本になります。
APIデータ取得ツールの設計:何をどう作るか
ツールの役割をシンプルに整理する
今回作る APIデータ取得ツール の役割を、まず言葉で整理してみます。
- 指定したAPIのURLにGETでアクセスする
- 必要に応じてクエリパラメータを付ける
- ステータスコードをチェックする
- 成功していればJSONレスポンスをPythonのオブジェクトとして返す
- 失敗していれば、レスポンス本文を表示して
Noneを返す
これを1つの関数にまとめておくと、 「どのAPIでも同じパターンでデータ取得ができる」便利なツールになります。
ステップ1:requestsで基本のGETを行う
まずは、APIデータ取得ツールの「心臓部」となるGET処理を作ります。
# day48_api_tool_basic_get.py
import requests # HTTP通信を簡単にしてくれるライブラリです。
def basic_get(url: str):
"""指定URLにGETでアクセスして、レスポンスを表示する基本関数です。"""
print(f"[GET] {url} にアクセスします。")
# GETリクエストを送ります。
response = requests.get(url)
# ステータスコード(成功かどうかの番号)を表示します。
print("ステータスコード:", response.status_code)
# レスポンスの本文(テキスト)を表示します。
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
# 練習用のAPIにアクセスしてみます。
basic_get("https://jsonplaceholder.typicode.com/posts")
Pythonここではまだ「ツール」というよりは、 GETの基本動作を確認するための小さな関数です。
ステップ2:JSONレスポンスを辞書・リストとして扱う
次に、APIレスポンスの中身(JSON)を、 Pythonのオブジェクトとして扱う部分を作っていきます。
# day48_api_tool_json.py
import requests
def get_json(url: str):
"""指定URLにGETでアクセスして、JSONレスポンスを辞書・リストとして返す関数です。"""
print(f"[GET] {url} にアクセスします。")
response = requests.get(url)
print("ステータスコード:", response.status_code)
# 成功(200番台)のときだけJSONを処理します。
if 200 <= response.status_code < 300:
try:
# JSONとしてレスポンスを解釈します。
data = response.json()
print("JSONを受け取りました。")
return data
except ValueError:
# JSONとして解釈できなかった場合の処理です。
print("JSONとして解釈できませんでした。レスポンス本文:")
print(response.text)
return None
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
return None
if __name__ == "__main__":
# 投稿一覧を取得するAPIにアクセスしてみます。
url = "https://jsonplaceholder.typicode.com/posts"
data = get_json(url)
if isinstance(data, list):
print("投稿件数:", len(data))
if data:
first = data[0]
print("最初の投稿タイトル:", first.get("title"))
Pythonここで重要なのは、
response.json()を使って、JSONをPythonの辞書・リストに変換していること- ステータスコードをチェックしてから中身を扱っていること
- JSONとして解釈できない場合のエラーハンドリングを入れていること
です。
ステップ3:クエリパラメータ対応のAPIデータ取得ツールにする
次に、クエリパラメータ(検索条件など)を指定できるようにして、 より「ツールらしい」形にしていきます。
# day48_api_data_tool.py
import requests
def get_api_json(
url: str,
params: dict | None = None,
) -> dict | list | None:
"""
APIデータ取得ツールのメイン関数です。
- URLにGETでアクセスします。
- 必要に応じてクエリパラメータを付けます。
- 成功したらJSONをPythonのオブジェクトとして返します。
"""
print(f"[GET] {url} にアクセスします。")
# GETリクエストを送ります。
# params= に辞書を渡すと、URLに ?key=value の形でクエリパラメータが付きます。
response = requests.get(url, params=params)
print("ステータスコード:", response.status_code)
print("実際にアクセスしたURL:", response.url)
# 成功(200番台)のときだけJSONを返します。
if 200 <= response.status_code < 300:
try:
data = response.json()
print("JSONを受け取りました。")
return data
except ValueError:
print("JSONとして解釈できませんでした。レスポンス本文:")
print(response.text)
return None
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
return None
def main():
# 1. 投稿一覧を取得する例
url_posts = "https://jsonplaceholder.typicode.com/posts"
posts = get_api_json(url_posts)
if isinstance(posts, list):
print("投稿件数:", len(posts))
if posts:
print("最初の投稿タイトル:", posts[0].get("title"))
# 2. 特定ユーザーの投稿だけ取得する例(クエリパラメータ付き)
posts_user1 = get_api_json(url_posts, params={"userId": 1})
if isinstance(posts_user1, list):
print("userId=1 の投稿件数:", len(posts_user1))
if posts_user1:
print("最初の投稿タイトル:", posts_user1[0].get("title"))
if __name__ == "__main__":
main()
Pythonこのコードが、Day 48で目指す APIデータ取得ツールの基本形 です。
ポイントを整理すると:
urlとparamsを渡すだけで、APIからJSONデータを取得できる- ステータスコードをチェックして、成功時だけJSONを扱う
- 実際にアクセスしたURLを表示することで、デバッグしやすくしている
という構造になっています。
ステップ4:APIレスポンスを「安全に」扱うための考え方
APIデータ取得ツールを実務で使うことを考えると、 次のようなポイントを意識しておくと安心です。
ステータスコードを必ず見る
status = response.status_code
if 200 <= status < 300:
# 成功時の処理
elif 400 <= status < 500:
# リクエスト側の問題(URL・パラメータ・認証など)
elif 500 <= status < 600:
# サーバー側の問題(時間をおいて再試行など)
Pythonこうして分岐しておくと、
- 自分の書いたコードが悪いのか
- API側の問題なのか
を切り分けやすくなります。
JSONの形を意識する
レスポンスがJSONの場合、
- 「リスト(複数件)」なのか
- 「辞書(1件の詳細)」なのか
を意識して扱うことが大事です。
例えば:
- 投稿一覧 → リスト
- 投稿詳細 → 辞書
というように、APIごとに形が違います。
Day 48のまとめ
Day 48では、API入門として、
- APIは「プログラム同士がやり取りするための窓口」であること
- REST APIは、HTTP+URL+メソッド(GET/POSTなど)でシンプルにデータを扱うスタイルであること
- JSONは、APIの世界の「共通語」であり、Pythonの辞書・リストと相性が良いこと
- APIレスポンスは、ステータスコード+ヘッダー+ボディ(JSONなど)で構成されていること
- requestsを使って、REST風APIからJSONレスポンスを取得し、Pythonのオブジェクトとして扱う APIデータ取得ツール を作れること
を、コード例とともに整理しました。
このツールをベースに、
- 天気予報API
- 為替レートAPI
- ニュースAPI
など、さまざまな外部サービスとつなげていくことで、 Pythonが「外の世界とつながる窓口」として、ぐっと頼もしく感じられるようになっていきます。
