Py初めてのPython

Day 5ファイル・API連携(外の世界とつながる)

requestsでWeb APIを叩く(GET/POST、ステータスコード、.json())

requestsでAPIにリクエストし、ステータスコードとレスポンスを正しく読む。

Web APIとは、プログラム向けの窓口

私たちがブラウザでWebサイトを見るとき、裏では「このページをください」というリクエストをサーバーに送り、サーバーがHTMLを返しています。Web API(エーピーアイ)は、これの「プログラム向け」版です。人間が見るための画面ではなく、プログラムが処理しやすいデータ(多くはJSON)を返してくれる窓口だと考えてください。天気、為替、地図、そしてAIのサービスも、多くはWeb API経由で使います。

PythonからWeb APIを呼ぶときの定番が requests(リクエスツ)ライブラリです。標準ライブラリではないので、最初に pip install requests でインストールします。使い方は直感的で、GETで「取ってくる」、POSTで「送って処理してもらう」、という2つの動作を覚えれば大半のことができます。

PYTHON
import requests

# GET: サーバーからデータを取ってくる
response = requests.get("https://api.example.com/users/1")

print(response.status_code)  # 例: 200(成功)
data = response.json()       # レスポンスのJSONを辞書に変換
print(data["name"])
GETリクエストでデータを取得する

ステータスコード: 成功か失敗かを表す番号

APIは、結果を3桁の数字(ステータスコード)で教えてくれます。200番台は成功、400番台は「あなたのリクエストがおかしい」、500番台は「サーバー側の問題」です。この番号を確認せずに response.json() を呼ぶと、失敗時にエラーページ(HTML)をJSONとして読もうとして落ちることがあります。まず番号を見る、という習慣が大事です。

  • 200 OK: 成功。データが返っている
  • 201 Created: 成功。POSTで新しいデータが作られた
  • 400 Bad Request: リクエストの形式が不正
  • 401 Unauthorized: 認証が必要、またはAPIキーが違う
  • 404 Not Found: 指定した対象が存在しない
  • 429 Too Many Requests: 短時間に呼びすぎ(レート制限)
  • 500 Internal Server Error: サーバー側の不具合
PYTHON
import requests

# POST: サーバーにデータを送って処理してもらう
payload = {"title": "買い物", "done": False}
response = requests.post(
    "https://api.example.com/todos",
    json=payload,          # 辞書を渡すと自動でJSONに変換して送る
    timeout=10,            # 10秒で応答がなければ諦める(重要)
)

if response.status_code == 201:
    created = response.json()
    print("作成成功:", created["id"])
else:
    print("失敗:", response.status_code, response.text)
POSTでデータを送る + ステータス確認

危うい書き方

ステータスを確認せず、いきなり .json() を呼ぶ。失敗時に落ちる。

PYTHON
res = requests.get(url)
data = res.json()  # 404やエラー時にここで例外

堅い書き方

まずステータスを確認し、成功したときだけ本文を読む。

PYTHON
res = requests.get(url, timeout=10)
if res.status_code == 200:
    data = res.json()
else:
    print("エラー:", res.status_code)

timeout を付けないと固まる

timeout を指定しないと、相手サーバーが応答しないとき、プログラムが永遠に待ち続けることがあります。ネットワークは必ず失敗しうる、という前提で、requests には毎回 timeout を付ける習慣をつけてください。

AIにはこう聞く

「requestsでこのAPIにGETして、status_codeが200のときだけ.json()を読み、それ以外はコードと本文をログに出すコードを書いて。timeoutは10秒」のように、成功時と失敗時の両方の振る舞いを指定すると、実務で使える形で返ってきます。

なぜGETとPOSTを区別するのか

GETは「取得するだけで、相手の状態を変えない」操作、POSTは「送信して相手の状態を変える(作成・登録など)」操作、という約束事です。この区別があるおかげで、GETは何度実行しても安全、POSTは繰り返すと二重登録に注意、といった判断ができます。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

requests.get() の戻り値に対して .json() を呼ぶ前に、まず確認すべきものはどれですか。

Q2

ステータスコード 401 が返ってきたとき、まず疑うべきことはどれですか。

Q3

GETとPOSTの違いを、初めての人にも分かるように説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。