採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

HTTPリクエスト

テクノロジ系 / L06 function — 関数設計

HTTPリクエスト — ハンズオン

前提: Pythonがインストールされている

目標: requestsでGETとPOSTを送り、JSONレスポンスを処理できる

Step 1: ライブラリをインストールする

pip install requests

確認:

python3 -c "import requests; print(requests.__version__)"

Step 2: GETリクエストを送る

get_request.py を作成:

import requests

# 公開テストAPI(返ってきたJSONを表示する)
response = requests.get("https://httpbin.org/json")

print(f"ステータスコード: {response.status_code}")
print(f"Content-Type: {response.headers['Content-Type']}")

data = response.json()
print("レスポンスデータ:")
print(data)

実行:

python3 get_request.py

確認: ステータスコードが200で、JSONデータが表示されるか確認する。

Step 3: クエリパラメータを付ける

get_params.py を作成:

import requests

params = {
    "name": "田中",
    "department": "技術部",
    "year": 2024
}

response = requests.get("https://httpbin.org/get", params=params)
data = response.json()

print("送ったパラメータ:")
for key, value in data["args"].items():
    print(f"  {key}: {value}")

print(f"\n実際のURL: {response.url}")

確認: URLにパラメータが付いていることを確認する。

Step 4: POSTリクエストを送る

post_request.py を作成:

import requests

payload = {
    "user": "田中",
    "message": "テストメッセージ",
    "priority": "high"
}

response = requests.post(
    "https://httpbin.org/post",
    json=payload
)

data = response.json()
print(f"ステータスコード: {response.status_code}")
print("送ったデータが返ってきた:")
print(data["json"])

Step 5: エラーハンドリングを試す

error_handling.py を作成:

import requests

def safe_get(url, timeout=5):
    try:
        response = requests.get(url, timeout=timeout)
        response.raise_for_status()
        return response.json()
    except requests.HTTPError as e:
        print(f"HTTPエラー {e.response.status_code}: {url}")
        return None
    except requests.ConnectionError:
        print(f"接続エラー: {url}")
        return None
    except requests.Timeout:
        print("タイムアウト")
        return None

# 成功ケース
result = safe_get("https://httpbin.org/json")
print("成功:", result is not None)

# 404エラーケース
result = safe_get("https://httpbin.org/status/404")
print("404の結果:", result)

# 500エラーケース
result = safe_get("https://httpbin.org/status/500")
print("500の結果:", result)

完了チェック

  • [ ] GETリクエストを送ってJSONレスポンスを確認した
  • [ ] クエリパラメータを付けてURLがどう変わるか確認した
  • [ ] POSTで辞書データを送り、返ってきたデータを確認した
  • [ ] HTTPエラー・接続エラーのハンドリングを動作確認した
  • [ ] ステータスコード200/404/500の意味を説明できる

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

Q1. GETとPOSTの使い分けを説明してください。

GET: データを取得する。検索条件などはURLのクエリパラメータとして渡す。

POST: データを送信・作成する。送信内容はリクエストBodyに入れる(JSON等)。

例: 検索→GET、ログイン・フォーム送信→POST

Q2. ステータスコード 401429 はそれぞれ何を意味しますか?

401 Unauthorized: 認証エラー。APIキーが誤っている、またはAuthorizationヘッダーがない。

429 Too Many Requests: レート制限。短時間にリクエストを送りすぎた場合に返される。

Q3. 以下のコードで params はURLにどう変換されますか?

import requests
params = {"name": "田中", "age": 30}
response = requests.get("https://api.example.com/users", params=params)

https://api.example.com/users?name=田中&age=30

requests.getparams を渡すと、自動でURLエンコードしてクエリ文字列に変換する。

Q4. response.raise_for_status() はなぜ使いますか?

ステータスコードが4xx(クライアントエラー)または5xx(サーバーエラー)の場合に、

自動で HTTPError 例外を発生させるため。

これを使わないと、404や500のエラーレスポンスでも例外が発生せず、

エラーに気づかないまま処理が続いてしまう可能性がある。

力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。