어떤 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 동사간에 일대일 매핑이 반드시 필요한 것은 아닙니다. 사이의 주요 차이점 PUT과 POST그들의 나무 등 속성에 관한 것입니다. 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.