어떤 HTTP 메소드가 어떤 CRUD 메소드와 일치합니까?


213

RESTful 스타일 프로그래밍에서는 HTTP 메소드를 빌딩 블록으로 사용해야합니다. 어떤 방법이 고전적인 CRUD 방법과 일치하더라도 약간 혼란 스럽습니다. GET / 읽기 및 삭제 / 삭제는 충분히 분명합니다.

그러나 PUT / POST의 차이점은 무엇입니까? 생성 및 업데이트와 일대일로 일치합니까?

답변:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT은 PUT과 함께 사용되는 URI의 존재 여부에 따라 Create와 Update에 모두 매핑 할 수 있습니다.

POST는 Create에 매핑됩니다.

수정 : POST는 일반적으로 Create에 사용되지만 Update에 매핑 할 수도 있습니다. POST는 부분 업데이트 일 수도 있으므로 제안 된 PATCH 방법이 필요하지 않습니다.


16
+1 : 클라이언트가 이름 (URI)을 할당 한 리소스를 생성하기 위해 PUT과 서버에서 이름을 할당 한 리소스를 생성하는 POST를 구분하는 것이 중요합니다. 이에 대한 논의는 Richardson과 Ruby의 Restful Web Services (O'Reilly)를 참조하십시오.
Jim Ferrans 2016 년

9
PUT과 DELETE는 아직 웹 브라우저에서 지원되지 않으므로 POST중인 URI에 method = PUT 또는 method = DELETE와 같은 쿼리 문자열 인수를 추가하여 "POST를 오버로드"하는 것이 좋습니다.
Jim Ferrans 2016 년


13
@JimFerrans PUT 및 DELETE는 XHR을 통해 웹 브라우저에서 잘 지원됩니다. 그러나 HTML 양식의 맥락에서 HTML 사양은이를 지원하지 않으므로 브라우저도 지원할 수 없습니다.
eis

3
CRUD에서 문자에 정식으로 맵핑하지는 않지만 많은 REST 프레임 워크는 GET / entity /를 사용하여 entity 유형의 엔티티나열 합니다. GET / entity / id는 id와 일치하는 특정 엔티티를 읽습니다 .
Toddius Zho

49

핵심은 당신이 dem 등식 변화를 하고 있는지 아닌지 입니다. 즉, 메시지에 대해 두 번 조치를 취하면 마치 한 번만 수행 된 것처럼 "같은"것이 존재하는 경우, dem 등 전한 변경 사항이 있으며 PUT에 매핑되어야합니다. 그렇지 않으면 POST에 맵핑됩니다. 클라이언트가 URL을 합성하도록 허용하지 않으면 PUT은 업데이트에 가깝고 POST는 Create를 잘 처리 할 수 ​​있지만 가장 확실한 유일한 방법은 아닙니다. 클라이언트가 자신이 만들고자 /foo/abc하는 내용을 알고 있고 어떤 내용을 넣을지를 안다면 PUT처럼 잘 작동합니다.

POST에 대한 정식 설명은 무언가를 구매하려고 할 때입니다. 이는 아무도 모르게 반복하고 싶지 않은 행동입니다. 대조적으로, 주문에 대한 발송 주소를 설정하는 것은 PUT으로 잘 수행 할 수 있습니다. 6 Anywhere Dr, Nowhereville한 번, 두 번 또는 백 번 으로 보내라는 메시지는 중요하지 않습니다 . 여전히 동일한 주소입니다. 이것이 업데이트라는 의미입니까? 가능 ... 백엔드 작성 방법에 따라 다릅니다. (결과가 동일하지 않을 수 있습니다. 자원 표현의 일부로 PUT을 마지막으로 수행했을 때 사용자에게 다시보고 할 수 있으므로 반복 된 PUT이 동일한 결과를 초래하지는 않지만 결과는 여전히 기능적으로 "동일"해야합니다.)


1
유스 케이스 POST와 그 사이의 이러한 차이점은 PUT흥미로운 것입니다. "어떤 것이 '생성'이고 어느 것이 '업데이트'입니까?" 훨씬 더 명확합니다. 또한, API의 구현과 관련하여, 반복적 인 데이터 PUT는 무소음 (no-no-op)이되어야하지만, POST전송되는 데이터의 일부 측면이 데이터 저장소에서 고유하게 유지된다면 반복자는 예외를 던질 수있다. 응용 프로그램을 지원합니다.
zerobandwidth

2
이 답변과 다음 의견은 중요한 점을 지적하는데, HTTP REST 의미론과 CRUD를 밀접하게 (1 대 1) 동일시 하는 데 주의기울여야 합니다. 정식 매핑이 아닙니다.
Martin Spamer

35

나는 같은 대답을 찾고 있었고 여기에 IBM의 말이 있습니다. IBM 링크

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

현재 (2016) 최신 HTTP 동사는 GET, POST, PATCH , PUT 및 DELETE입니다.

개요

  • HTTP GET-선택 / 요청
  • HTTP PUT-업데이트
  • HTTP POST-삽입 / 생성
  • HTTP PATCH- 완전한 리소스 표현을 PUT 할 때 번거롭고 더 많은 대역폭을 활용하는 경우 (예 : 열을 부분적으로 업데이트해야하는 경우)
  • HTTP 삭제-삭제

도움이 되었기를 바랍니다!

REST API 설계에 관심이 있으시다면이 책을 읽으십시오. 웹 사이트 온라인 버전 github 저장소


1
'18 년 2 월 현재, PATCH는 클라이언트 및 서버 라이브러리에서 완전히 구현되지 않습니다.
Dizzley

오 알았어요 고마워요 ... 링크 / 참조를 게시하여 주시겠습니까?
d1jhoni1b

9

stormpath의 훌륭한 YouTube 비디오 대화가 실제로 이것을 설명하며 URL은 비디오의 올바른 부분으로 건너 뛰어야합니다.

스톰 패스 YouTube 동영상

또한 REST API를 만드는 데 시간을 투자 할 생각이라면 한 시간 이상 이야기하지만 매우 혼란 스럽습니다.


7

구체적인 상황에 따라 다릅니다 .. 그러나 일반적으로 :

PUT = 구체적인 URI로 구체적인 자원을 업데이트하거나 변경합니다.

POST = 주어진 URI의 소스 아래에 새로운 리소스를 만듭니다 .

블로그 게시물을 편집하십시오.

PUT : / blog / entry / 1

새로운 것을 만드십시오 :

POST : / blog / entry

PUT은 요청 전에 새로운 리소스의 URI가 명확한 일부 상황에서 새로운 리소스를 생성 할 수 있습니다. POST는 다른 여러 유스 케이스도 구현하는 데 사용할 수 있으며 다른 유스 케이스 (GET, PUT, DELETE, HEAD, OPTIONS)는 다루지 않습니다.

CRUD 시스템에 대한 일반적인 이해는 GET = 요청, POST = 작성, Put = 업데이트, DELETE = 삭제입니다.


4

REST의 빌딩 블록은 주로 리소스 (및 URI)와 하이퍼 미디어입니다. 이러한 맥락에서, GET자원의 표현을 얻는 방법입니다 (실제로 SELECTCRUD 용어 로 맵핑 될 수 있음 ).

그러나 CRUD 작업과 HTTP 동사간에 일대일 매핑이 반드시 필요한 것은 아닙니다. 사이의 주요 차이점 PUTPOST그들의 나무 등 속성에 관한 것입니다. POST또한 일반적으로 PUT완전히 새로운 리소스 표현을 보내는 것을 의미 하므로 부분 업데이트에 더 일반적으로 사용됩니다 .

나는 이것을 읽는 것이 좋습니다.

HTTP 사양 도 유용한 참고 자료입니다 :

PUT 메소드는 동봉 된 엔티티가 제공된 Request-URI 아래에 저장되도록 요청합니다.

[...]

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


3

일반적으로, 이것은 내가 사용하는 패턴입니다.

  • HTTP GET-선택 / 요청
  • HTTP PUT-업데이트
  • HTTP POST-삽입 / 생성
  • HTTP 삭제-삭제

5
PUT과 POST는 Update 또는 Create와 정확히 일치하지 않습니다. PUT은 "설정"(즉, 리소스 이름을 미리 알고 사용할 값을 제공하는 경우)이며 POST는 그 밖의 모든 것입니다. 열쇠는 당신이하고있는 일이 dem 등원 인지 아닌지를 생각하는 것 입니다.
Donal Fellows

1
댓글에 +1 둘 사이의 절대 매핑 가정은 오해의 소지가 있습니다. 예를 들어, 일부 URI에 대한 HTTP DELETE 작업은 단순히 서버 측 레코드를 수정 (예 : UPDATE)하여 HTTP GET 작업이 더 이상 표현을 반환하지 않을 수 있습니다.

4
PUT과 POST는 Update 또는 Create와 정확히 일치하지 않습니다 . 사실이지만 AJ는 어떤 패턴 사용 하는지 설명했습니다 .
Piotr Dobrogost

1

심포니 는 HTTP 방식을 유지하는 프로젝트의 시도는 CRUD 방법과 함께 합류 자신의 목록 은 다음과 같이 동료를 :

  • GET 서버에서 리소스를 가져옵니다
  • POST 서버에서 리소스를 만듭니다.
  • PUT 서버의 리소스를 업데이트합니다
  • 삭제 서버에서 리소스를 삭제합니다

"실제로 많은 최신 브라우저는 PUT 및 DELETE 방법을 지원하지 않습니다."

내가 기억하는 바에 따르면 Symfony는 폼을 생성 할 때 지원하지 않는 브라우저에 대해 PUT 및 DELETE를 "가짜" "브라우저가 지원하지 않는 경우에도 이론적으로 올바른 HTTP 방법을 사용하려고 시도합니다" 그것.

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