본문을 포함하려면 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.