Day 46:HTTPの基本を「Webと会話する言葉」として理解する
Web・API編の最初の一歩は、HTTP という仕組みを知ることから始まります。 ブラウザでページを開くときも、スマホアプリがサーバーとやり取りするときも、 その裏側では必ずと言っていいほど HTTP が使われています。
今日は、
- HTTPとは
- URL
- GET
- POST
- ヘッダー
- ステータスコード
という6つのキーワードを、雑誌記事を読むような感覚で、 やわらかく・でもしっかりと、コード例と一緒に理解していきます。
HTTPとは:Webの「会話のルール」
「ブラウザ」と「サーバー」が話すためのプロトコル
HTTPは、ひと言でいうと 「Webでデータをやり取りするための会話のルール」 です。
- ブラウザ(ChromeやEdgeなど)が「このページ見せて」とサーバーにお願いする
- サーバーが「いいよ、これがそのページだよ」と返す
この「お願い」と「返事」のやり取りを、決まった形式で行うためのルールが HTTP です。
PythonでAPIを叩くときも、 「HTTPというルールに従って、サーバーにお願いを送る」 というイメージになります。
URL:Web上の「住所」と「部屋番号」
URLの構造をざっくり分解してみる
よく見るURLを、少し分解してみます。
例:
https://example.com/api/users?page=2
これをパーツに分けると、こんな感じです。
https://- 通信の方法(プロトコル)。HTTPの安全版が HTTPS です。
example.com- サーバーの住所(ドメイン名)です。
/api/users- サーバーの中の「どの機能・どのデータにアクセスするか」を表すパスです。
?page=2- 追加の情報(クエリパラメータ)。「2ページ目をください」といった指定に使います。
URLは、「どのサーバーの、どの場所に、どんな条件でアクセスするか」 をまとめたものだと考えると分かりやすいです。
GET:情報を「取りに行く」リクエスト
GETは「ください」のリクエスト
HTTPにはいくつかの「メソッド」がありますが、 最もよく使うのが GET です。
- Webページを開く
- APIからデータを取得する
こうした「情報を取りに行く」動きは、ほとんどが GET です。
PythonでGETしてみる(requestsライブラリ)
ここでは、人気の requests ライブラリを使って、 シンプルな GET リクエストを送る例を見てみます。
# day46_http_get_basic.py
import requests # HTTP通信を簡単にしてくれるライブラリです。
def get_example():
"""シンプルなGETリクエストの例です。"""
# アクセスしたいURLを指定します。
url = "https://httpbin.org/get"
# GETリクエストを送ります。
response = requests.get(url)
# ステータスコード(成功かどうかの番号)を表示します。
print("ステータスコード:", response.status_code)
# レスポンスの中身(テキスト)を表示します。
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_example()
Pythonここでのポイントは、
requests.get(url)が「GETでください」とサーバーにお願いしていることresponse.status_codeが「うまくいったかどうか」を教えてくれる番号であることresponse.textにサーバーからの返事(本文)が入っていること
です。
POST:情報を「送りつける」リクエスト
POSTは「これ送るから、処理して」のリクエスト
GETが「情報をください」だとすると、 POSTは「このデータを送るから、登録して・処理して」 というイメージです。
- 会員登録フォームの送信
- ログイン情報の送信
- 新しいデータの登録
こうした「何かをサーバーに渡す」場面で、POSTがよく使われます。
PythonでPOSTしてみる(JSONデータを送る)
# day46_http_post_basic.py
import requests
def post_example():
"""シンプルなPOSTリクエストの例です。"""
url = "https://httpbin.org/post"
# サーバーに送りたいデータ(辞書)を用意します。
data = {
"username": "taro",
"score": 100
}
# POSTリクエストを送ります。json= を使うとJSON形式で送ってくれます。
response = requests.post(url, json=data)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
post_example()
Pythonポイント:
requests.post(url, json=data)で、「JSON形式のデータ」をサーバーに送っています。- サーバー側は、このデータを受け取って、登録したり、計算したり、何かしらの処理を行います。
ヘッダー:リクエストやレスポンスに付く「名刺・メモ」
ヘッダーは「付箋メモ」のようなもの
HTTPには、ヘッダー(header) という情報があります。 これは、リクエストやレスポンスにくっついている「追加情報」です。
イメージとしては、
- 「このデータはJSONだよ」
- 「このブラウザからアクセスしているよ」
- 「認証トークンはこれだよ」
といったメモを、リクエストやレスポンスに付箋のように貼り付けている感じです。
リクエストヘッダーを付けてGETしてみる
# day46_http_headers.py
import requests
def get_with_headers():
"""ヘッダー付きのGETリクエストの例です。"""
url = "https://httpbin.org/headers"
# 送りたいヘッダー情報を辞書で用意します。
headers = {
"User-Agent": "Python-Requests-Example/1.0",
"X-Custom-Token": "abc123"
}
# ヘッダーを付けてGETリクエストを送ります。
response = requests.get(url, headers=headers)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
if __name__ == "__main__":
get_with_headers()
Pythonポイント:
headers=に辞書を渡すことで、リクエストヘッダーを自由に付けられます。- 認証が必要なAPIでは、ここに「APIキー」や「トークン」を入れることがよくあります。
ステータスコード:サーバーからの「結果の番号」
ステータスコードは「どうなったか」を教えてくれる
HTTPの世界では、ステータスコード という番号がとても重要です。 これは、サーバーが「リクエストに対してどう応答したか」を表す番号です。
よく使うものをいくつか挙げると:
200:OK(成功)201:Created(新規作成成功)400:Bad Request(リクエストがおかしい)401:Unauthorized(認証が必要・認証失敗)403:Forbidden(アクセス禁止)404:Not Found(見つからない)500:Internal Server Error(サーバー側のエラー)
PythonでAPIを叩くときは、 「ステータスコードを必ずチェックする」 という習慣をつけておくと安全です。
ステータスコードを見て分岐する例
# day46_http_status_check.py
import requests
def get_with_status_check():
"""ステータスコードをチェックして分岐する例です。"""
url = "https://httpbin.org/status/200" # ここを 404 や 500 に変えると挙動が変わります。
response = requests.get(url)
status = response.status_code
print("ステータスコード:", status)
# 成功(200番台)のとき
if 200 <= status < 300:
print("成功しました。レスポンスを処理します。")
# 実際のAPIではここで response.json() などを使って中身を処理します。
# クライアント側の問題(400番台)のとき
elif 400 <= status < 500:
print("リクエストに問題があります。URLやパラメータを確認してください。")
# サーバー側の問題(500番台)のとき
elif 500 <= status < 600:
print("サーバー側でエラーが発生しています。時間をおいて再試行してください。")
else:
print("想定外のステータスコードです。")
if __name__ == "__main__":
get_with_status_check()
Pythonポイント:
- ステータスコードを見て、「成功なのか」「自分のリクエストが悪いのか」「サーバーが落ちているのか」を判断できます。
- 業務自動化でAPIを使うときは、ここにログ出力や再試行ロジックを組み込むことが多いです。
Day 46ミニテンプレート:HTTP入門用の小さなツール
最後に、Day 46の要素をまとめた「HTTP入門ミニツール」を示します。 GET・POST・ヘッダー・ステータスコードを一通り触れる構成です。
# day46_http_mini_tool.py
import requests
def get_json(url: str):
"""指定URLにGETしてJSONを受け取る簡易関数です。"""
print(f"[GET] {url} にアクセスします。")
response = requests.get(url)
print("ステータスコード:", response.status_code)
if response.status_code == 200:
print("成功しました。JSONを表示します。")
try:
data = response.json() # レスポンスをJSONとして解釈します。
print(data)
except ValueError:
print("JSONとして解釈できませんでした。テキストを表示します。")
print(response.text)
else:
print("成功しませんでした。レスポンス本文:")
print(response.text)
def post_json(url: str, payload: dict):
"""指定URLにJSONをPOSTする簡易関数です。"""
print(f"[POST] {url} にデータを送信します。")
print("送信データ:", payload)
response = requests.post(url, json=payload)
print("ステータスコード:", response.status_code)
print("レスポンス本文:")
print(response.text)
def main():
# GETの例
get_json("https://httpbin.org/get")
# POSTの例
payload = {"username": "hanako", "score": 95}
post_json("https://httpbin.org/post", payload)
if __name__ == "__main__":
main()
Pythonこのミニツールを動かしてみると、
- URLを指定してGETする感覚
- JSONを受け取る感覚
- データをPOSTする感覚
- ステータスコードを確認する習慣
が、手を動かしながら自然と身についていきます。
Day 46のまとめ
Day 46では、HTTPの基本として、
- HTTPとは「ブラウザやプログラムがサーバーと会話するためのルール」であること
- URLは「どのサーバーの、どの場所に、どんな条件でアクセスするか」を表す住所+条件であること
- GETは「情報をください」、POSTは「このデータを送るから処理して」というリクエストであること
- ヘッダーは「このデータはJSONだよ」「認証トークンはこれだよ」といった付箋メモのような役割を持つこと
- ステータスコードは「成功・失敗・原因」を番号で教えてくれる重要な指標であること
を整理しました。
ここから先は、このHTTPの基礎の上に、 「APIを叩いてデータを取得する」「外部サービスと連携する」 といった、 より実践的なWeb・API自動化の世界が広がっていきます。

