2009-03-31 1 views
2

에세이를 기록 할 수있는 기존 웹 앱이 있습니다.기존 웹 응용 프로그램을위한 RESTful API 설계에 대한 질문

사용자는 에세이의 새 개정판을 시작하거나, 저장하거나, 다시 시작하거나, 제출할 수 있습니다 (채점). 개정판이 제출되면 완료로 표시되고 나중에 개정되지 않습니다. 사용자가 새 버전을 시작하면 이전 응답이 현재 버전으로 복사됩니다. 사용자가 개정을 다시 시작하면 현재 개정 (즉, 진행 중)으로 작업합니다. 저장되었지만 제출되지 않은 개정이 '진행 중'상태입니다.

우리는 클라이언트 응용 프로그램에서 동일한 작업을 수행 할 수있는 API를 설계해야합니다.

첫 번째 단계에서 우리는 최신 버전의 에세이를 얻을 필요가 있습니다 (진행 중이거나 완료되었거나 아직 존재하지 않을 수 있으므로 (단지 템플릿 만 반환)). 이

<revision> 
    <id> </id> 
    <response> </response> 
    <status> </status> 
</revision> 

나중에 클라이언트 앱이 변경된 개정을 보내야 같은

 GET user/{userid}/revisions/mostrecent

개정의 형식은 STH 될 것이다. 내가 에세이 개정의 서로 다른 상태를 처리하는 방법을 잘 모르겠습니다 그러나

은 ('진행 중' 'COMPLETE'), 즉 클라이언트 응용 프로그램은 개정 상태에 따라 다른 PUT/POST 작업을하거나,해야한다 그냥 POST sth 및 모든 서버 쪽 (내가 RESTful API를 믿지 다음) 처리해야합니다?

나는 새로운 버전을 보내는 것이라고 생각 :

 POST user/{userid}/revisions

그리고 현재 버전 업데이트 다음을 설정하여 (

 PUT user/{userid}/revisions/{id}

하지만 어떻게 개정이뿐만 아니라 구원을 제출해야 함을 구별하는 방법을 상태를 'INPROGRESS'로 변경)?

그리고 여러 개의 IN PROGRESS 개정판을 만드는 것을 방지하는 방법 (이미 'INPROGRESS'개정판이 있으면 POST가 실행되지 않습니다)?
이전 버전을 업데이트하는 것을 방지하는 방법

(상태가 = 다음 PUT COMPLETE가 금지되는 경우?) 어떤 힌트이나 제안에 대한

감사합니다.

답변

0

그러나 어떻게 개정에만 저장해야한다는 구별하지 않기 ( 'INPROGRESS'에 상태를 설정하여) 제출?

id를 인수로 전달하는 경우 개정판을 저장해야한다는 것을 유추하지는 않습니까? 에세이 나 개정판은 {Id}인가요? 에세이의 경우 개정판 ID (또는 단지 datetime 스탬프)를 작성한 다음 편안한 URI에도 함께 전달하십시오.(당신은 SQL Server를 사용하는 경우 또는 database lock)

PUT 사용자/{사용자 ID}/에세이/{ID는}/개정/{수정 ID}

당신은 동시 수정을 방지하기 위해 에세이에 locking 메커니즘을 사용할 수 있습니다 'Completed'플래그는 이전 버전을 업데이트하지 못하도록하는 좋은 생각입니다.

+0

id는 개정판입니다 (동일한 이름의 개정판과 에세이 모두 사용하고 있습니다). – matali

0

상태를 제공하는 PUT/POST 요청으로 데이터를 보낼 수 있습니다. 필요한 경우 또는 이와 같은 경우이거나 레코드를 수정하지 않고 레코드를 수정하는 경우입니다. 사실, 당신이 실제로하고있는 것은 RESTful 트랜잭션입니다.

다른 질문에는 비즈니스 로직이 필요합니다. REST는 요청에 대한 응답으로 적절한 상태 코드를 반환하도록 지시합니다. 데이터의 상태에 따라 요청을 처리해야하는 방법과 명령을 지정하지 않습니다. 말했다되고 그건

, 당신이 무엇을 요구에 대한 느슨한 논리는 다음과 같습니다 답변에 대한

if is_new_revision() and old_revision_is_pending(): 
    return "409 Conflict" 
if revision_id != most_recent_revision_id: 
    return "403 Forbidden" 
0

감사합니다.

우리 웹 애플 리케이션의 동작을 모방하기 위해서는 클라이언트 측에도 로직이 있어야한다는 것을 이해합니다. 모든 경우에 대해 POST/PUT 개정과 같은 하나의 일반 명령을 갖는 것만으로는 충분하지 않습니다 (새 개정판을 시작하고 이전 개정판을 다시 시작하십시오). 클라이언트는 수정 버전이 진행중인 경우 저장/제출할 수 있지만 완전하면 (그리고 다른 모든 상황) 수 없습니다.

1

WebDAVversioning과 함께 사용 하시겠습니까? HTTP를 기반으로 자신의 프로토콜을 롤링하는 것보다 훨씬 강력하다고 생각합니다.

3

"GET user/{userid}/revisions/mostrecent"와 같은 URI 명명 규칙을 지정하면 RESTful 아키텍처의 제약 조건 중 하나가 위반됩니다. RESTful이라고 할 경우 API의 일부로 자원에 대한 URI 또는 ​​URI 템플리트를 정의 할 수 없습니다.

자세한 내용은 http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven을 참조하십시오.

관련 문제