본문을 포함하려면 HTTP PUT 요청이 필요합니까?


92

표준에서 이것에 대한 명확한 사양을 찾는 데 어려움이 있습니다. Content-Length: 0본문을 지정하지 않은 PUT 요청을 수행 할 때 헤더를 포함하지 않는 HTTP 클라이언트 와 이러한 요청에 의해 혼란스러워지는 서버가 있는데 어떤 프로그램을 비난해야할지 궁금합니다.


내가 물어볼 수 있다면 왜 2009 년의 질문을 편집하겠습니까?
zmuci

@zmuci 더 나은 형식을 원하십니까?
Константин Ван

답변:


83

HTTP 요청에 Content-Length 또는 Transfer-Encoding 헤더가있는 경우 본문이 있습니다 ( RFC 2616 4.3 ). 요청에 본문이없는 경우에는 본문이 없으므로 서버에서이를 처리해야합니다.

즉, PUT 요청에 본문이없는 것은 드문 경우이므로 실제로 빈 본문을 보내려는 클라이언트를 디자인하는 경우 Content-Length : 0을 전달합니다. 실제로 POST 읽기에 따라 및 PUT 방법 정의 ( RFC 2616 9.5, 9.6 ) 본문이 필요함을 암시한다고 주장 할 수 있지만 본문을 처리하지 않는 합리적인 방법은 길이가 0 인 본문을 가정하는 것입니다.


HTTP 상태 코드 200 ( "OK"), 201 ( "Created") 및 204 ( "No Content")가 의미하는 것처럼 PUT요청은 기본적으로 서버에서 파일을 생성하거나 업데이트하기위한 것입니다. 그리고 파일이 비어있는 것에 대해 불법적 인 것은 없습니다.
Константин Ван


5
@bdonlan 당신은 빈 본문이있는 PUT가 비정상적이라고 말했지만 사용자를 활성화하거나 비활성화하려면 요청에 본문이 필요하지 않습니다. 실제로 PUT 요청은 "/ users / {id} / enable"이 될 수 있습니다. 또는 "/ users / {id} / disable".
Vinicius de Almeida

@ViniciusdeAlmeida REST 표준을 준수하려는 경우 이러한 리소스는 적절하지 않습니다. disable그리고 enable동사입니다. 아마 사용하는 것을 선호 거라고 PATCH/users/{id}경우에 엔드 포인트.
분쇄

42

질문에 대답하지 않고 jaxrs가 어떻게 신체없는 PUT를 자주 사용할 수 있는지 주장합니다.

bodyless put의 예 : 사용자에게 추가 권한을 부여합니다.

PUT / admin / users / {사용자 이름} / permission / {permission}


2
내 문제 야! 나는 같은 결론에 도달했습니다. 그러나 엄밀히 말하면 이것은 RFC에 위배되며, 명시 적으로 언급되지는 않았지만 body를 기존이라고합니다. 문제를 일으킬 수 있지만 내 경험상 모든 최신 웹 서버 / 프레임 워크가 작동합니다.
Agoston Horvath

비슷한 경우에 기존 리소스를 사용자와 연결하려면 API가 필요합니다. 본문에 resourceId와 함께 POST users / : userId / resources를 사용할 수 있습니다. 또는 오히려 PUT users / : userid / resources / : resourceId에 맞을 것입니다. 여기서 가장 큰 차이점은 첫 번째 API가 멱 등성이 아니기 때문에 동일한 리소스를 사용자에게 두 번 연결할 수 있다는 것입니다. PUT 호출은 이전 연결을 재설정해야합니다.
Carmine Ingaldi

5

본문이없는 경우 내용 길이는 0이어야하지만 IETF 표준에서는 본문이 필요하지 않습니다. 수행중인 작업에 적합한 방법을 사용하십시오. 코드에 넣으면

int x;
int f(){ return x; }

라는 원격 변수가 r있습니다.

게시물은 다음과 같습니다.

r=f();

풋은 다음과 같습니다.

r=x;

get은 다음과 같습니다.

x=r;

1
이것은 주제에서 벗어난 PUT 대 POST의 가장 명확한 예입니다
디지털 환상

요청에 Content-Length 헤더가 있으면 본문이 있습니다. 그것은 빈 몸일 수 있지만 여전히 몸입니다. Content-Length 헤더가없는 요청과 달리 본문이 전혀없고 비어 있지도 않습니다. 그렇습니다. PUT 요청은 엄밀히 말하면 본문이 있어야합니다. 항상.
Paul Groke

또한 귀하의 POST 비유는 완전히 혼란 스럽습니다. 나머지 비유를 유지하려고하면 서버에있는 것과 비슷해야합니다. int f(int* resource, int body);그러면 POST가 호출 f(&r, x);될 것 r입니다. 서버가 적절하다고 생각 하는 대로 수행하거나 수행하지 않을 수 있습니다 . 하지만 항목을 반환 할 수도 있으므로 y = f(&r, x);.
Paul Groke

0

콘텐츠가없는 경우 서버에 PUT (동사 의미로)되는 것은 무엇입니까? 사양은 "동봉 된 엔터티"같은 내용을 의미하지만, 내용이없는 요청에 따라서 서버에 넣어 아무것도없는 밀폐 된 실체가없는, 그리고 것입니다.

물론 서버에 아무것도 넣지 않으려면 대신 DELETE를 원할 것입니다.


1
귀하의 퍼팅이 본문이 아닌 URL로 인코딩 될 수있는 것
MikeT

1
PUT empty는 ID 자체 외에 콘텐츠가 없지만 주어진 ID를 가진 리소스가 서버에 있어야 함을 선언하는 것입니다. DELETE와는 완전히 다른 의미입니다.
Imre Pühvel

리소스를 PUT하고 모든 서버 측 기본값을 수락한다고 가정 해보십시오. 그것은 Content-Length: 0또는 { }본문으로 JSON에서입니까?
Luke Puplett

1
컴퓨터에 빈 파일 이 하나도 없습니다. 그렇죠?
Константин Ван

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.