기술 · 실용 가이드
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을, 다른 것은 HTML을 반환합니다.
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을 저장해야 종료됩니다.
