テクノロジー · 実用ガイド
requests の JSONDecodeError が char 0?解析前に response bytes を証明する
final URL、status、Content-Type、raw byte length、安全な prefix を保存し、空 response、HTML/text、消費済み stream、JSON を分離します。

“Expecting value: line 1 column 1 (char 0)” は parser が先頭で JSON value を見つけられないことだけを示し、quote や library の故障を証明しません。
再試行前に同じ response の request、redirect、status、media type、byte length、redacted prefix を固定します。
再試行前に一つの失敗交換を固定
同じ失敗 call の method、sanitized target、status_code、final URL、redirect history を記録し、可能なら時刻と correlation ID も保存します。
credential、cookie、Authorization、無制限 body は記録せず、選択した header と短い redacted prefix だけを残します。
parser 選択前に bytes を測定
response.content を一度だけ bounded variable に読み、長さを記録します。zero byte なら JSON document はありません。
stream=True では consumption owner を確認します。iter_content、raw.read、middleware が EOF まで進めた可能性があります。
status、redirect、Content-Type をまとめて解釈
Requests は 204 または invalid body で json() が例外になると説明します。204 は正当な outcome なので endpoint contract に従います。
final URL と redirects を確認します。login、rate-limit、404 HTML、502 gateway は「<」から始まり char 0 で失敗し得ます。
HTTP failure と representation failure を分離
raise_for_status を先に呼ぶかは API contract 次第です。error status が JSON を返す API もあります。
status が異常なら auth、endpoint、redirect、proxy、upstream を修復し、representation 違反なら安全な sample を保存します。
一度だけ parse して exit condition を証明
contract が JSON を許し bytes が非空になってから response.json() または json.loads(body) を呼びます。
同じ runtime と network path で expected status、compatible type、non-zero bytes、single parse、schema validation を保存して終了します。
