업데이트를 위해 모든 기사 데이터를 API로 다시 보내야하며 다중 사용자 작업을 구현할 수 없습니다. 예를 들어 편집기는 5 초 더 오래된 데이터를 보내고 다른 기자가 2 초 전에 방금 수정 한 수정 사항을 덮어 쓸 수 있으며 기사를 게시하는 사람들은 실제로 콘텐츠 업데이트와 관련이 없기 때문에이를 고객에게 설명 할 방법이 없습니다.
이런 종류의 일은 당신이 무엇을하든 도전입니다. 분산 소스 제어 (mercurial, git 등)와 매우 유사한 문제이며 HTTP / ReST로 철자 한 솔루션은 약간 비슷합니다.
Alice와 Bob이라는 두 명의 사용자가 모두 작업하고 있다고 가정합니다 /articles/lunch
. (명확하게하기 위해 응답은 굵은 글씨로 표시됨)
먼저, alice가 기사를 작성합니다.
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
요청에 첨부 된 "버전"이 없기 때문에 서버가 리소스를 만들지 않았습니다 (의 식별자를 가정합니다 /articles/{id}/{version}
. 생성을 수행하기 위해 Alice는 만들려는 기사 / 버전의 URL로 리디렉션 됨) Alice의 사용자 상담원은 새 주소에서 요청을 다시 적용합니다.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
그리고 이제 기사가 작성되었습니다. 다음으로 밥은 기사를 봅니다.
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
밥은 거기에 보인다 :
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
그는 자신의 변화를 추가하기로 결정합니다.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
Alice와 마찬가지로 Bob은 새 버전을 만들 위치로 리디렉션됩니다.
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
마지막으로 Alice는 자신의 기사에 추가하기로 결정합니다.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
정상적인 상태로 리디렉션되는 대신 다른 상태 코드가 클라이언트에 반환되어 409
Alice가 분기하려는 버전이 이미 분기되었음을 알립니다. 어쨌든 ( Location
헤더 로 표시 한대로) 새 자원이 작성되었으며 두 자원 의 차이점이 응답 본문에 포함되었습니다. Alice는 이제 방금 요청한 내용을 어떻게 병합해야하는지 알고 있습니다.
이 모든 리디렉션은의 의미와 관련되어 PUT
있으므로 요청 라인이 요청하는 위치에 정확하게 새로운 리소스를 만들어야합니다. 이것은 POST
대신 사용하여 요청주기를 절약 할 수 있지만 버전 번호는 다른 마술에 의해 요청에 인코딩되어야합니다. 이는 설명을 위해 나에게 덜 분명해 보이지만 실제 API에서는 여전히 선호됩니다. 요청 / 응답주기를 최소화합니다.
api/article?action=publish
? 쿼리 매개 변수는 리소스 상태가 언급 한 '알고리즘'(또는 작업)에 따라 달라지는 경우에 사용됩니다. 예 :api/articles?sort=asc
유효