콘텐츠 협상

Content Negotiation

Accept 헤더로 원하는 표현 형식을 알리고 서버가 지원하는 응답 타입을 선택합니다.

···
html
<div class="viz"><h3>ONE RESOURCE · TWO FORMS</h3><div class="row"><div class="box code" id="accept">Accept: application/json</div><span class="arrow">→</span><div class="box code" id="representation">{ "id": 42 }</div></div><div class="muted" id="content-type">Content-Type: application/json</div></div>
css
.viz{width:94%;height:88%;max-width:960px;padding:clamp(10px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);font:600 clamp(12px,1.35vw,16px)/1.35 var(--font-sans,system-ui,sans-serif);display:flex;flex-direction:column;gap:clamp(7px,1.8vmin,13px);overflow:hidden}.viz h3{margin:0;color:var(--accent);font:700 clamp(12px,1.35vw,16px)/1.2 var(--font-sans,system-ui,sans-serif);letter-spacing:.04em}.viz .row{display:flex;align-items:center;justify-content:center;gap:clamp(5px,1.4vmin,12px);flex:1;min-height:0}.viz .box{padding:clamp(5px,1.5vmin,12px);border:1px solid var(--line);border-radius:9px;background:var(--bg);text-align:center}.viz .muted{color:var(--muted)}.viz .accent{color:var(--accent)}.viz .code{font-family:ui-monospace,monospace}.viz .pill{padding:3px 7px;border:1px solid var(--line);border-radius:99px;white-space:nowrap}.viz .active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,var(--surface))}.viz .arrow{color:var(--accent);font:700 18px ui-monospace,monospace}#accept,#representation{width:41%;overflow-wrap:anywhere}.row{gap:5px}
js
let json=false;function draw(){json=!json;document.getElementById('accept').textContent=json?'Accept: application/json':'Accept: text/plain';document.getElementById('representation').textContent=json?'{ "id": 42 }':'order 42';document.getElementById('content-type').textContent='Content-Type: '+(json?'application/json':'text/plain')}draw();setInterval(draw,1400)

HTTP 콘텐츠 협상에서 클라이언트는 Accept 헤더로 처리 가능한 미디어 타입을 보냅니다. 서버는 자원의 표현 중 맞는 형식을 골라 Content-Type으로 응답합니다. 서버가 원하는 형식을 제공할 수 없으면 406을 돌리거나 규칙에 따라 다른 표현을 선택할 수 있습니다.

데모는 같은 자원에 JSON과 텍스트 Accept를 번갈아 보내 응답 모양이 달라지는 모습을 보여줍니다. 캐시를 쓴다면 표현 선택에 영향을 준 요청 헤더를 Vary에 반영해야 서로 다른 표현이 섞이지 않습니다.

언제 쓰나

같은 API 자원을 JSON·텍스트 등 여러 표현으로 제공할 때 씁니다.

페이지로 열기 ↗