Python Requests の Response は、受信した HTTP 状態・ヘッダー・本文を別々に調べるためのオブジェクトです。文字列表示、JSON解析、HTTP成功判定は同じ操作ではありません。
| この記事の要点 |
|---|
|
レスポンス取得例
以下は元の最小例です。url は許可された取得先を別途設定する変数で、単独では実行できません。timeout 未指定では無期限に待つ場合があります。実用時は requests.get(url, timeout=(3, 10)) のように接続・読取の待ち時間を指定します。この値は本文全体の総時間制限ではありません。取得処理や再試行の設計はHTTPリクエストの方法で確認してください。
|
response = requests.get(url) |
レスポンスを文字列で取得
|
res_str = response.text |
レスポンスをJSONで取得
先に status_code と必要な成功条件を確認します。json() は HTTP エラーでも解析できる一方、204や不正JSONでは requests.exceptions.JSONDecodeError が発生します。空本文を勝手に空の辞書へ置換しません。
|
res_json = response.json() |
JSONオブジェクトなら dict、配列なら list、数値なら int / float、真偽値なら bool、null なら None になります。dict 固定ではないので、キーを参照する前に期待した形か確認します。
text・content・encoding の違い
| 確認する値 | 用途と注意 |
|---|---|
| response.content | 本文の bytes。画像等のバイナリにも使う。gzip等は通常展開済みで、通信時の生バイトそのものではない。 |
| response.text | 本文を復号した str。encoding の影響を受ける。表示できても正しい文字コードとは限らない。 |
| response.encoding | ヘッダー等から決まる文字コード。仕様や別の確実な根拠があるときだけ変更し、その後で text を読む。 |
| response.apparent_encoding | 検出器による推定。正解の保証ではなく、参照時に本文の読込みも起こり得る。 |
例えばヘッダーが誤っていて、実体が UTF-8 と分かっている検体なら response.encoding = "utf-8" の後に response.text を読み直します。すべての文字化けに UTF-8 を強制する対処ではありません。厳密な復号エラーを検出したい場合は、既知の文字コードで response.content.decode("utf-8", errors="strict") を使い、UnicodeDecodeError を扱います。text は通常、復号できない箇所を置換して返すため、データ完全性の検査にはなりません。
status_code・ok・raise_for_status を分ける
status_code は整数です。raise_for_status() は 4xx / 5xx に HTTPError を投げますが、302や304を失敗とは扱いません。ok と bool(response) も「200のみ」や「2xxのみ」ではありません。404の Response も受信済みオブジェクトなので、存在判定なら response is not None と明示します。成功条件を 200 や 2xx に限定するかは相手APIの契約に合わせます。
200でもHTMLのエラーページが届く場合があり、500でも正しいJSONが届きます。json() の成功だけで業務成功と判断しません。Content-Type は response.headers.get("Content-Type") で確認でき、未指定なら None です。JSONの宣言があることと、内容・型が正しいことも別です。汎用の応答検証やサイズ上限処理はHTTP取得側の記事を参照してください。
headers・cookies・url・history の読み方
headers は大文字小文字を区別しない辞書風オブジェクトです。headers["Content-Type"] は欠落すると KeyError、get() は既定値を指定できます。重複ヘッダーは結合される場合があるため、生のヘッダー一覧や値の単純なカンマ分割と同一視しません。特に Set-Cookie は Expires 内にもカンマを含みます。
response.cookies はその応答で設定されたCookieのjarで、Session全体の蓄積とは別です。同じ名前でも domain / path が異なるCookieがあり、辞書化で情報を失う場合があります。Cookieの送信・保存・選択はCookieの設定と取得で確認します。GETでリダイレクトを許した場合、url は最終URL、history は古い順の途中の Response です。追従しなければ302自体を確認でき、履歴は空になります。HEADは既定の追従動作が異なります。
elapsed は本文全体の所要時間ではない
response.elapsed.total_seconds() はリクエスト送信から応答ヘッダー解析完了までの時間を秒で返します。本文をすべて読む時間は含みません。elapsed.microseconds は1秒未満部分だけなので合計秒には使いません。リダイレクト後の elapsed だけを全行程の時間と扱わず、history の各応答と区別します。読込み・解析を含む経過時間を測るなら対象処理の前後を time.perf_counter() で囲みますが、このページの値は速度改善の実測比較ではありません。
stream=True で読み取るときの消費と解放
通常は取得時に本文も読み込みますが、stream=True では本文を後から消費します。with requests.get(url, stream=True, timeout=(3, 10)) as response: の範囲で iter_content() を読み切るか、途中でやめたら close() します。with は例外時も解放します。stream=True でも先に content / text / json() を参照すると本文全体の読込みが起こり、メモリ節約の狙いを失います。
iter_content() のチャンクは指定サイズと常に同じ長さとは限らず、gzip等の展開も行われます。一度読み切ったストリームを再度同じように読めるとは限りません。raw はより低水準のストリームで、通常の本文処理には iter_content() を使います。下の decoded_size は展開後のバイト数を数える説明例で、サイズ上限や総時間制限の実装ではありません。信頼できない巨大データを無制限に読む用途へ転用しません。
必要な情報だけを記録する例
次のファイルは既に取得した Response を受け取り、固定項目だけのメタ情報、既知の文字コードでの表示、ストリームの消費を別関数にします。本文・ヘッダー・URLの内容は出力せず、汎用HTTP取得・再試行は実装しません。
"""Response inspection only; no transport policy, retries, or external calls."""
def metadata(response):
# Fixed allowlist. No URL, body, cookies, request or arbitrary header values.
return {
"status": response.status_code,
"header_seconds": response.elapsed.total_seconds(),
"redirect_count": len(response.history),
}
def read_text(response, encoding=None):
if encoding is not None:
response.encoding = encoding # Only use an independently known charset.
return response.text
def decoded_size(response):
# Consumes the stream; does not retain the complete body in this function.
# Not a download limit or an HTTP policy helper.
return sum(len(chunk) for chunk in response.iter_content(chunk_size=8192) if chunk)
確認環境と公式資料
2026-10-26、Python 3.12.10 / Requests 2.34.2 / urllib3 2.8.0 の隔離loopback HTTPで、正常・異常・空JSON、文字コード、バイナリ、gzip、ヘッダー、リダイレクト、ストリームと時間の境界を確認しました。外部API・実資格情報・TLS・本番通信の検証ではありません。
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09