2017-02-15 4 views
2

Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content에서 : 요청의 표현 데이터가 어떤없이 저장하지 않는 한PUT 요청에 대한 응답이 ETag를 제공하지 않아야하는 이유는 무엇입니까?

가 원 서버가 PUT에 성공적으로 응답, 같은 ETag 또는 Last-Modified 필드로 발리 헤더 필드 (Section 7.2)를 전송해서는 안 (즉, 자원의 새로운 표현 데이터는 PUT 요청에서 수신 된 표현 데이터와 동일하다) 유효성 검사기 필드 값은 새로운 표현을 반영한다. 이 요구 사항은 사용자 에이전트가 PUT의 결과로 현재 메모리에있는 표현 본문이 현재 상태로 남아 있으므로 원래 서버에서 다시 검색 할 필요가없고, 의 새 유효성 검사기가 우발적 인 덮어 쓰기 (Section 5.2)를 방지하기 위해 향후 조건부 요청에 응답을 사용할 수 있습니다.

이 섹션을 완전히 이해할 수는 없습니다 ... 굵은 문장은 모순 된 것 같습니다. 그렇습니까? PUT에 관한 검증 섹션 헤더를 갖는 동사 만 있음이

주 (GET/POST/DELETE/PATCH 참조).

+0

여기에는 모순이 없습니다. 요점은 실제로 저장 한 것이 클라이언트가 보낸 것일 경우에만 서버가 Etag를 반환 할 수 있다는 것입니다. 서버가 데이터를 수정하면 클라이언트는 후속 GET 요청을 사용하여 콘텐츠를 가져와야합니다. –

답변

3

요점은 서버가 저장하기 전에 표현을 변경하거나 변경하지 않을 수도 있다는 것입니다. 같은 대상 자원에 대한 후속 GET200 (OK) 응답으로 전송되고 상응하는 표현을 초래할 것이라고 제안 주어진 표현의

성공적인 PUT : 섹션에서 당신은 연결. 그러나 목표 서버가 원 서버에 의해 동적 처리를받을 수 있으므로 이러한 상태 변화가 관찰 될 것이라는 보장은 없습니다.

따라서 표준에서는 유효성 검사기 헤더의 유무를 사용하여 표현이 변경되었는지 여부를 사용자 에이전트에게 알립니다.

표현이 변경되지 않은 경우 서버는 유효성 검사기 헤더 필드를 반환 할 수 있으며 사용 도구는 방금 보낸 표현을 조건부로 유효성을 검사하는 데 사용할 수 있습니다.

표현이 변경되면 사용자 에이전트의 표현이 잘못 정의됩니다. 따라서 validator 헤더는 반환되지 않으며 사용자 에이전트는 무조건 GET을 수행해야합니다.

+1

고마워, 하나 남은 질문 : 클라이언트가 리소스의 버전을 가지고 그것을 수정 PUT 서버에 추가 수정을 적용하고 클라이언트에 새 표현을 반환합니다. 이 경우 요청 본문! = 응답의 본문입니다. 서버가 응답 내에서 새로운 ETag를 직접 제공 할 수없는 이유는 무엇입니까? 그런 다음 클라이언트는 로컬 ETag가 응답의 캐시와 일치하는지 확인하고 이에 따라 캐시를 업데이트 할 수 있습니다. 이것은 클라이언트가 리소스를 다시 얻는 것을 피할 것입니다 (어떤 응답은 PUT 응답과 똑같은 본문을 갖지만 ETag는이 시간입니다). – sp00m

+1

@ sp00m : 여기서 혼동은 서버가 응답 본문에서 'PUT'으로 다시 전송한다고 가정한다는 것입니다. 하지만 그렇지 않습니다. 서버를 제어한다면 물론 할 수는 있지만 표준에 포함되지는 않습니다. 그래서 일반적으로 새로운 (무조건적인)'GET'을하지 않고서도 사용자 에이전트가 새로운 표현을 알 수있는 방법이 없다. –

+0

아, 맞아, 여기 내가 정확히 놓친 게 맞아. 고마워! – sp00m

관련 문제