게시물의 차이점은 무엇입니까?
질문
RFC 2616, § 9.5에 따르면, 게시물은 자원을 만드는 데 사용됩니다.
POST 메소드는 원본 서버가 요청 행에서 요청 된 리소스의 새로운 하위 부하로 요청 된 엔티티를 요청한 리소스로 동의하도록 요청하는 데 사용됩니다.
RFC 2616, § 9.6에 따르면, PUT은 자원을 작성하거나 대체하는 데 사용됩니다.
PUT 메서드는 동봉 된 엔티티가 제공된 요청 URI하에 저장되었음을 요청합니다.요청 -URI가 이미 기존 리소스를 참조하면 동봉 된 엔티티를 원본 서버에있는 수정 된 버전으로 간주되어야합니다.요청 - URI가 기존 리소스를 가리키지 않고 URI가 요청한 사용자 에이전트가 새 리소스로 정의 할 수있는 경우 원본 서버는 해당 URI로 자원을 작성할 수 있습니다.
그래서 어떤 HTTP 메소드를 사용하여 자원을 만드는 데 사용해야합니까?또는 둘 다 지원해야합니까?
답변
전반적인:
PUT과 POST는 모두 생성에 사용할 수 있습니다.
당신은 "당신이 그 행동을 수행하는 것은 무엇을 수행하고 있습니까?"를 묻고, 사용 해야하는 것을 구별하기 위해 묻습니다.질문을하는 API를 설계하고자합니다.POST를 사용하려는 경우 질문 목록으로 사용할 수 있습니다.풋을 사용하고 싶다면 특정 질문에 그렇게 할 것입니다.
훌륭하고, 둘 다 사용할 수 있으므로 어떤 사람이 내 편안한 디자인으로 사용해야합니까?
풋과 게시물을 모두 지원할 필요가 없습니다.
당신이 사용하는 것은 당신에게 달려 있습니다.그러나 요청에서 참조하는 객체에 따라 오른쪽 하나를 사용하는 것을 잊지 마십시오.
몇 가지 고려 사항 :
명시 적으로 생성 한 URL 개체의 이름을 지정하거나 서버가 결정할 수 있습니까?이름을 지정하면 풋을 사용하십시오.서버가 결정한 다음 게시물을 사용하도록 허용 한 경우. Put은 멱등성을 가정하도록 정의되므로 객체를 두 번 넣으면 추가 효과가 없어야합니다.이것은 멋진 재산이므로 가능한 한 쓸 때 사용할 것입니다.Put-idempotency가 실제로 서버에서 올바르게 구현되었는지 확인하십시오. 동일한 객체 URL을 사용하여 자원을 업데이트하거나 작성할 수 있습니다. POST를 사용하면 동시에 URL을 수정하는 데 2 개의 요청을 가질 수 있으며 개체의 다른 부분을 업데이트 할 수 있습니다.
예 :
나는 이것에 대해 다른 대답의 일환으로 다음과 같은 것을 썼다.
게시하다:
자원을 수정하고 업데이트하는 데 사용됩니다
게시 / 질문 /
또한, 조금 더 간결하게, rfc 7231 섹션 4.3.4 put States (강조 추가),
4.3.4.놓다 PUT 메서드는 대상 자원의 상태가 될 것을 요청합니다. 표현에 의해 정의 된 상태로 생성되거나 대체되었습니다. 요청 메시지 페이로드에서 동봉됩니다.
답변
웹에서 어설 션을 찾을 수 있습니다
Post를 사용하여 자원을 만드는 데 사용해야하며, 하나를 수정하는 데 사용해야합니다. PUT을 사용하여 자원을 만드는 데 사용해야하며 POST를 사용하여 하나를 수정해야합니다.
어느 쪽도 아주 옳지 않다.
조치의 멱등을 기반으로 한 풋과 포스트를 선택하는 것이 좋습니다.
주어진 URL에서 다른 것을 다른 URL에서 사용할 수있는 모든 것을 사용할 수있는 모든 것을 다른 것으로 교체하는 자원을 완전히 교체하는 것을 의미합니다.정의에 따라, Put은 멱등이 있습니다.원하는만큼 여러 번하십시오. 결과는 동일합니다.x = 5는 멱등 텐트입니다.이전에 존재하는지 여부에 관계없이 자원을 넣을 수 있습니다 (예 : 작성 또는 업데이트)!
POST는 자원을 업데이트하고 자회사 리소스를 추가하거나 변경을 일으 킵니다.X ++가 멱등이 아닌 방식으로 게시물이 멱등이 아닙니다.
이 인수로, 작성 할 일의 URL을 알 수있는시기를 작성하기위한 것입니다.게시물을 만들고 싶은 일들의 범주에 대한 "공장"또는 관리자의 URL을 알고있을 때 생성하는 데 사용할 수 있습니다.
그래서:
POST /expense-report
또는:
PUT /expense-report/10929
답변
URL에 게시하면 서버 정의 URL에 하위 자원을 만듭니다. URL에 넣기 클라이언트 정의 URL에서 리소스를 생성 / 대체합니다. URL에 패치가 클라이언트 정의 된 URL에서 리소스의 일부를 업데이트합니다.
PUT 및 POST에 대한 관련 사양은 RFC 2616 §9.5ff입니다.
Post 자식 자원을 만듭니다. 따라서 / 항목에 게시물이 / 항목 자원 아래에 삽입되는 리소스를 만듭니다. 예./ items / 1.동일한 게시물 패킷을 두 번 보내면 두 개의 리소스가 생성됩니다.
PUT은 클라이언트가 알고있는 URL에서 리소스를 만들거나 교체하는 것입니다.
따라서 다음은 클라이언트가 자원이 생성되기 전에 클라이언트가 URL을 이미 알고있는 CREATE CREATE에 대한 후보입니다.예./ blogs / nigel / entr / when_to_use_post_vs_put 제목이 리소스 키로 사용됩니다.
알려진 URL에서 리소스를 이미 존재하는 경우 자원을 대체하므로 동일한 요청을 두 번 두 번 송신하지 않습니다.다른 말로하면, 착용 할 호출은 멱등이 있습니다.
RFC는 다음과 같이 읽습니다.
게시물과 풋 요청의 근본적인 차이는 요청 - URI의 다른 의미에 반영됩니다.POST 요청의 URI는 동봉 된 엔티티를 처리 할 리소스를 식별합니다.이 자원은 데이터 수락 프로세스, 일부 다른 프로토콜의 게이트웨이 또는 주석을 수락하는 별도의 엔터티 일 수 있습니다.대조적으로, PUT 요청의 URI는 요청으로 묶인 엔티티를 식별합니다. 사용자 에이전트는 URI가 의도하고 서버가 요청을 다른 리소스에 적용하지 않아야합니다.서버가 요청이 다른 URI에 적용될 것을 원한다면,
참고 : PUT은 대부분 자원을 업데이트하는 데 사용되었습니다 (그들의 ENTIRETIES에서 교체하여). 그러나 최근에 기존 리소스를 업데이트하기위한 패치를 사용하여 이동이 있습니다.RFC 5789.
업데이트 2018 : 피해야 할 경우가있는 경우가 있습니다."놓지 않고 휴식"을 참조하십시오.
"놓치지 않고 휴식"기술로, 아이디어는 소비자가 새로운 '비공개'요청 자원을 게시해야합니다.논의 이전에 고객의 메일 링 주소를 변경하는 것은 새로운 기능입니다. "ChangeOfAddress"자원은 "고객"리소스가없는 자원이 아닙니다. 다른 메일 링 주소 필드 값.
REST API 디자인에서 가져온 - Prakash Subramaniam의 자원 모델링
이렇게하면 API가 여러 클라이언트의 상태 전환 문제를 방지하여 단일 리소스를 업데이트하고 이벤트 소싱 및 CQR과보다 훌륭하게 일치시킵니다.작업이 비동기 적으로 수행되면 변환을 게시하고 기다리고 기다리고 있습니다.
답변
POST는 ""새로 만들기 "를 의미합니다."여기에서 사용자를 만드는 입력은 사용자를 만드는 입력 "을 의미합니다."
PUT은 "INSERT, IF IF IF IF IF IF IF IF IF IF IF IF EXECTS"를 의미합니다. "
아직 사용자의 URL을 모르는 이래로 example.com/users에 게시됩니다. 서버가 서버를 만들 수 있습니다.
특정 사용자를 대체 / 작성하려는 이후로 example.com/users/ID를 입력합니다.
동일한 데이터로 두 번 게시하는 것은 IDS가 다른 두 개의 동일한 사용자를 만듭니다.동일한 데이터로 두 번 넣으면 사용자가 처음으로 작성하고 두 번째 시간 (변경 사항 없음)과 동일한 상태로 업데이트합니다.당신이 그것을 얼마나 많은 시간을 할 수 있는지 상관없이 착용 한 후에 같은 상태로 끝나기 때문에, idempotent 매번 "똑같이 강력한"이라고합니다.이것은 요청을 자동으로 다시 시도하는 데 유용합니다.더 이상 '브라우저에서 뒤로 버튼을 누르면 다시 보려는 것을 확신 할 수 있습니다.
일반적인 조언은 자원의 URL 생성을 제어 할 서버가 필요할 때 POST를 사용하는 것입니다.그렇지 않으면 사용하십시오.게시물을 선호하십시오.
답변
요약:
만들다:
다음과 같은 방식으로 두 번째 또는 게시물로 수행 할 수 있습니다.
놓다
NewResourceID를 사용하여 새 리소스를 식별자, / 리소스 URI 또는 컬렉션으로 만듭니다.
put / Resources /
업데이트:
다음과 같은 방식으로 만 수행 할 수 있습니다.
놓다
resistResourceID를 사용하여 자원을 식별자, / 리소스 URI 또는 컬렉션으로 업데이트합니다.
put / resources /
설명:
휴식 및 URI를 일반적으로 처리 할 때 왼쪽에 일반적이고 오른쪽에 특정한 것입니다.제네릭은 일반적으로 컬렉션이라고하며 더 많은 항목을 리소스라고 할 수 있습니다.리소스에는 컬렉션이 포함될 수 있습니다.
예 : <- 일반 - 특정 -> uri : website.com/users/john. website.com - 전체 사이트 사용자 - 사용자 모음 John - 컬렉션의 항목 또는 자원 URI : webinde.com/users/john/posts/23. website.com - 전체 사이트 사용자 - 사용자 모음 John - 컬렉션의 항목 또는 자원 게시물 - 요한의 게시물 수집 23 - John에서 식별자 23, 또한 자원
게시물을 사용하면 항상 컬렉션을 참조하고 있으므로 말할 때마다 :
POST /users HTTP/1.1
사용자 컬렉션에 새 사용자를 게시하고 있습니다.
당신이 계속 해서이 것처럼 시도하십시오 :
POST /users/john HTTP/1.1
그것은 작동 할 것이지만, 의미 론적으로 사용자 컬렉션 아래에 John 컬렉션에 자원을 추가하려고합니다.
Put을 사용하고 있으면 컬렉션 내에 자원 또는 단일 항목을 참조하십시오.그래서 당신이 말할 때 :
PUT /users/john HTTP/1.1
서버 업데이트 또는 존재하지 않으면 생성하지 않으면 사용자 컬렉션의 John 리소스가 표시됩니다.
투기:
사양의 중요한 부분을 강조하겠습니다.
게시하다
POST 메소드는 원본 서버가 요청 행에서 요청 된 리소스의 새로운 하위 부하로 요청에 포함 된 엔티티를 요청 행에서 식별 된 리소스의 새로운 하위로 허용하도록 요청하는 데 사용됩니다.
따라서 컬렉션에 새 자원을 만듭니다.
놓다
PUT 메서드는 동봉 된 엔티티가 제공된 요청 URI하에 저장되었음을 요청합니다.요청 -URI가 이미 기존 리소스를 참조하면 동봉 된 엔티티를 원본 서버에있는 수정 된 버전으로 간주되어야합니다.요청 - URI가 기존 자원을 가리키지 않고 URI가 요청한 사용자 에이전트가 새 리소스로 정의 할 수있는 경우 원본 서버는 해당 URI를 사용하여 자원을 만들 수 있습니다. "
따라서 자원의 존재에 따라 작성하거나 업데이트하십시오.
참조:
http / 1.1 사양 Wikipedia - rest. URI (Uniform Resource Identifiers) : 일반 구문 및 의미
답변
내 "실용적인"조언을 추가하고 싶습니다.저장할 객체가 저장할 수있는 "ID"를 알 수있을 때 PUT을 사용하십시오.Put을 사용하면 향후 조회 또는 업데이트를 수행하기 위해 데이터베이스 생성 ID가 반환 될 필요가있는 경우 너무 잘 작동하지 않습니다.
그래서 : 기존 사용자를 저장하거나 클라이언트가 ID를 생성하고 ID가 고유 한 것으로 확인되었습니다.
PUT /user/12345 HTTP/1.1 <-- create the user providing the id 12345
Host: mydomain.com
GET /user/12345 HTTP/1.1 <-- return that user
Host: mydomain.com
그렇지 않으면 POST를 사용하여 개체를 처음 작성하고 객체를 업데이트 할 수 있습니다.
POST /user HTTP/1.1 <--- create the user, server returns 12345
Host: mydomain.com
PUT /user/12345 HTTP/1.1 <--- update the user
Host: mydomain.com
출처:https://stackoverflow.com/questions/630453/what-is-the-difference-between-post-and-put-in-http
최근댓글