REST에서 PUT과 POST

http rest post put


HTTP / 1.1 사양에 따르면 :

POST 방법은 원 서버에 의해 식별되는 자원의 새로운 부속물로서 요구에 포함 된 엔터티 접수 할 것을 요구하는 데 사용한다 Request-URIRequest-Line

즉, POST 는을 만드는 데 사용됩니다 .

PUT 동봉 엔티티 제공된 방법에 따라 저장 요청 Request-URI . 는 IF Request-URI 이미 존재하는 자원을 말한다, 동봉 된 엔터티는 원 서버에있는 하나의 변경된 버전으로 간주해야한다. 경우] Request-URI 기존 자원을 가리 키지 않고, URI는 요청하는 사용자 에이전트에 의하여 새로운 자원으로서 정의 될 수있는 것으로, 원 서버는 그 URI와 리소스를 생성 할 수있다. "

즉, PUT 은을 만들거나 바꾸는 데 사용됩니다 .

리소스를 만드는 데 어떤 것을 사용해야합니까? 아니면 둘 다 지원해야합니까?




Answer 1 Brian R. Bondy


Overall:

PUT과 POST는 모두 생성에 사용될 수 있습니다.

"무슨 행동을하고 있습니까?" 사용해야 할 것을 구별하기 위해. 질문을하기위한 API를 디자인한다고 가정 해 봅시다. POST를 사용하려면 질문 목록을 작성하십시오. PUT을 사용하려면 특정 질문에 대해 PUT을 사용하십시오.

둘 다 사용할 수 있으므로 RESTful 디자인에서 어느 것을 사용해야합니까?

PUT과 POST를 모두 지원할 필요는 없습니다.

사용되는 것은 당신에게 달려 있습니다. 그러나 요청에서 참조하는 객체에 따라 올바른 것을 사용하십시오.

몇 가지 고려 사항 :

  • 작성한 URL 객체의 이름을 명시 적으로 지정합니까, 아니면 서버가 결정하도록 하시겠습니까? 이름을 지정하면 PUT을 사용하십시오. 서버가 결정하게하면 POST를 사용하십시오.
  • PUT은 dem 등원이므로 개체를 두 번 PUT하면 아무런 효과가 없습니다. 이것은 좋은 속성이므로 가능한 경우 PUT을 사용합니다.
  • 동일한 객체 URL로 PUT을 사용하여 자원을 업데이트하거나 작성할 수 있습니다.
  • POST를 사용하면 URL을 수정하는 동시에 2 개의 요청을 수신 할 수 있으며 오브젝트의 다른 부분을 업데이트 할 수 있습니다.

예를 들면 :

나는 이것에 관해 SO에 대한 또 다른 대답의 일부로 다음을 썼습니다 .

POST:

자원 수정 및 업데이트에 사용

POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/

다음은 오류입니다.

POST /questions/<new_question> HTTP/1.1
Host: www.example.com/

URL이 아직 작성되지 않은 경우 이름을 지정하는 동안 POST를 사용하여 URL을 작성하지 않아야합니다. <new_question> 이 아직 없기 때문에 '리소스를 찾을 수 없음'오류가 발생 합니다. 먼저 서버 에서 <new_question> 리소스를 넣어야 합니다.

POST를 사용하여 리소스를 만들기 위해 이와 같은 작업을 수행 할 수 있습니다.

POST /questions HTTP/1.1
Host: www.example.com/

이 경우 리소스 이름을 지정하지 않으면 새 객체 URL 경로가 반환됩니다.

PUT:

리소스를 만들거나 덮어 쓰는 데 사용됩니다. 자원을 새 URL로 지정하는 동안.

새로운 자료 :

PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/

기존 리소스를 덮어 쓰려면

PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/

또한 RFC 7231 섹션 4.3.4 PUT 상태 (강조 추가)

4.3.4. 놓다

PUT 메소드는 대상 자원의 상태를 created 하거나 요청 메시지 페이로드에 포함 된 표현으로 정의 된 상태 replaced 도록 요청합니다.




Answer 2 Cheeso


웹에서 다음과 같은 어설 션을 찾을 수 있습니다.

둘 다 옳지 않다.


동작의 dem 등성 에 따라 PUT과 POST 중에서 선택하는 것이 좋습니다.

PUT 은 주어진 URL에서 사용 가능한 모든 것을 다른 것으로 완전히 대체하여 리소스를 넣는 것을 의미합니다. 정의상 PUT은 dem 등원입니다. 원하는만큼 여러 번하면 결과는 같습니다. x=5 는 dem 등원입니다. 리소스의 존재 여부에 관계없이 리소스를 PUT 할 수 있습니다 (예 : 생성 또는 업데이트)!

POST 는 리소스를 업데이트하거나 보조 리소스를 추가하거나 변경을 유발합니다. x++ 가 is 등원이 아닌 방식으로 POST는 dem 등성이 아닙니다.


이 인수에 의해, PUT은 작성할 것의 URL을 알 때 작성하기위한 것입니다. POST를 사용하여 만들려는 항목의 범주에 대한 "공장"또는 관리자의 URL을 알고있을 때 만들 수 있습니다.

so:

POST /expense-report

or:

PUT  /expense-report/10929



Answer 3 Nigel Thorne


  • URL로 POST서버 정의 URL에 하위 리소스만듭니다 .
  • URL에 대한 PUT클라이언트가 정의한 URL 에서 전체적으로 자원작성 / 대체합니다 .
  • URL로 PATCH 는 해당 클라이언트 정의 URL에서 자원의 일부업데이트합니다 .

PUT 및 POST에 대한 관련 사양은 RFC 2616 §9.5ff입니다.

POST는 하위 자원을 작성 하므로 POST to /items/items 자원 아래에있는 자원을 작성 합니다. 예 : /items/1 . 동일한 포스트 패킷을 두 번 보내면 두 개의 리소스가 만들어집니다.

PUT클라이언트가 알고 있는 URL 에서 자원을 작성하거나 대체하기위한 것 입니다.

따라서 PUT 은 리소스가 생성되기 전에 클라이언트가 이미 URL을 알고있는 CREATE의 후보 일뿐입니다. 예 : 제목으로 /blogs/nigel/entry/when_to_use_post_vs_put 을 리소스 키로 사용

PUT 은 알려진 URL의 자원이 이미 존재하는 경우이를 대체하므로 동일한 요청을 두 번 보내는 것은 효과가 없습니다. 즉, PUT 호출은 dem 등원 입니다.

RFC는 다음과 같습니다.

POST와 PUT 요청의 근본적인 차이점은 Request-URI의 다른 의미에 반영됩니다. POST 요청의 URI는 동봉 된 엔터티를 처리 할 리소스를 식별합니다. 해당 리소스는 데이터 수락 프로세스, 다른 프로토콜의 게이트웨이 또는 주석을 허용하는 별도의 엔터티 일 수 있습니다. 반대로 PUT 요청의 URI는 요청으로 둘러싸인 엔티티를 식별합니다. 사용자 에이전트는 의도 된 URI를 알고 있으며 서버는 요청을 다른 자원에 적용해서는 안됩니다. 서버가 요청을 다른 URI에 적용하기를 원하는 경우,

참고 : PUT은 주로 전체를 교체하여 리소스를 업데이트하는 데 사용되었지만 최근에는 PUT이 전체 리소스를 교체하도록 지정하므로 기존 리소스를 업데이트하기 위해 PATCH를 사용하는 방향으로 이동하고 있습니다. RFC 5789.

2018 업데이트 : PUT을 피할 수있는 경우가 있습니다. "PUT없는 REST" 참조

"PUT없는 REST"기술을 사용하면 소비자는 새로운 'ununified'요청 리소스를 게시해야합니다. 앞에서 설명한 것처럼 고객의 우편 주소 변경은 다른 우편 주소 필드 값을 가진 "고객"자원의 PUT이 아닌 새로운 "ChangeOfAddress"자원에 대한 POST입니다.

에서 가져온 인 ThoughtWorks의 프라 카쉬 Subramaniam에 의해 자원 모델링 - REST API 디자인

이를 통해 API는 여러 클라이언트가 단일 리소스를 업데이트 할 때 상태 전이 문제를 방지하고 이벤트 소싱 및 CQRS와 더 잘 일치합니다. 작업이 비동기 적으로 수행되면 변환을 POST하고 적용되기를 기다리는 것이 적절 해 보입니다.




Answer 4 7hi4g0


Summary:

Create:

다음과 같은 방식으로 PUT 또는 POST로 수행 할 수 있습니다.

PUT

생성 새로운 자원 newResourceId 은 / 자원 URI 또는 아래의 식별자를 수집 .

PUT /resources/<newResourceId> HTTP/1.1 

POST

작성 은 / 자원 URI, 또는 아래에 새로운 자원을 수집 . 일반적으로 식별자는 서버에서 반환합니다.

POST /resources HTTP/1.1

Update:

다음과 같은 방식으로 PUT으로 수행 할 있습니다.

PUT

/ resources URI 또는 collection 에서 식별자 로 existingResourceId 를 사용 하여 자원을 업데이트합니다 .

PUT /resources/<existingResourceId> HTTP/1.1

Explanation:

REST 및 URI를 일반적으로 처리 할 때 왼쪽에 일반 이 있고 오른쪽특정있습니다 . 제네릭은 보통이라고 컬렉션 과 더 특정의 항목을 호출 할 수 있습니다 자원 . • 그래도 참고 자원이 포함 할 수있는 모음 .

Examples:

<-일반-특정->

URI: website.com/users/john
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource

URI:website.com/users/john/posts/23
website.com  - whole site
users        - collection of users
john         - item of the collection, or a resource
posts        - collection of posts from john
23           - post from john with identifier 23, also a resource

POST를 사용하면 항상 collection을 참조 하므로 다음과 같이 말할 때마다 :

POST /users HTTP/1.1

새로운 사용자를 users 컬렉션에 게시합니다 .

계속해서 다음과 같이 해보십시오 :

POST /users/john HTTP/1.1

작동하지만 의미 상 사용자 콜렉션 아래의 john 콜렉션 에 자원을 추가하려고합니다 .

일단 PUT을 사용 하고 있다면 콜렉션 내부의 자원 또는 단일 항목을 참조 하는 것 입니다 . 그래서 당신이 말할 때 :

PUT /users/john HTTP/1.1

서버 업데이트를 알리거나 사용자 콜렉션 아래에 john 자원 이 존재하지 않는 경우 작성하십시오 .

Spec:

스펙의 중요한 부분을 강조하겠습니다 :

POST

POST의 방법은 원 서버가 해당 요청에 사용되는 동의를 A와 요청에 포함 된 엔터티 하위 Request-Line의 Request-URI에 의해 식별되는 자원을

따라서 컬렉션 에 새 리소스 를 만듭니다 .

PUT

PUT에 동봉 될 엔티티가 요청 방법 저장된 제공된 요청-URI하에. Request-URI가 이미 존재하는 자원을 참조하는 경우 동봉 된 엔티티는 원본 서버에 있는 수정 된 버전 으로 간주해야 합니다. Request-URI가 기존 자원을 가리 키지 않고 요청 사용자 에이전트 가 해당 URI를 자원 으로 정의 할 수있는 경우, 원래 서버는 해당 URI로 자원을 작성할있습니다 . "

따라서 자원의 존재에 따라 작성하거나 업데이트하십시오 .

Reference:




Answer 5 Alexander Torstling


POST 는 "여기서 사용자를 작성하고 입력하십시오"와 같이 "새로 작성"을 의미합니다.

PUT 은 "사용자 5의 데이터는 다음과 같습니다"와 같이 "이미 존재하는 경우 삽입, 교체"를 의미합니다.

당신 POST 당신이 알고하지 않기 때문에 example.com/users에 URL 아직 사용자의, 당신은 서버를 만들려고합니다.

당신은 PUT 당신이 /로 교체 만들려는 이후 example.com/users/id하는 특정의 사용자.

동일한 데이터로 두 번 게시하면 ID가 다른 두 명의 동일한 사용자가 생성됩니다. 동일한 데이터로 두 번 PUT하면 첫 번째 사용자가 생성되고 두 번째로 동일한 상태로 업데이트됩니다 (변경 사항 없음). PUT 을 수행 한 횟수에 관계없이 PUT 후에도 동일한 상태가되기 때문에 매번 "동등한"힘을 발휘합니다. 요청을 자동으로 재 시도하는 데 유용합니다. 브라우저에서 뒤로 버튼을 누를 때 더 이상 '재전송 하시겠습니까?'

일반적인 조언은 서버가 자원 의 URL 생성을 제어해야 할 때 POST 를 사용 하는 것입니다 . 그렇지 않으면 PUT 을 사용하십시오 . POST 보다 PUT 을 선호하십시오 .