2014-11-14 2 views
1

내 API에 RPC 스타일 동사가 표시되는 데 문제가 있습니다.RESTFUL (하이퍼 미디어) API의 동사

내 질문은 : Restful API에서 "Submit", "SendForApproval", "Accept"및 "Reject"동사를 사용해도 괜찮습니까? 그것은 안정된 원칙에 반하는 것입니까? 이러한 작업의 이름을 지정하는 가장 좋은 방법은 무엇입니까?

비즈니스 사례 : 주문이 있습니다. 그것은 "pre-ordered"상태에서 시작합니다. 그런 다음 비즈니스 로직에 대한 주문의 유효성을 확인하는 전화를 걸고 싶습니다. 검증 결과에 따라 제출하거나 승인을 위해 보내십시오. 승인 프로세스는 외부 적으로 Google 솔루션에서 발생하며 승인 프로세스를 거쳤을 때 Accept 또는 Rejected로 주문을 표시하기 위해 Api가 호출됩니다.

은 좀 더 간단하게 업데이트 상태보다가 벌어지고 - 우리는 등 문서 그래서 URI의 우리가 정의했다고

이다 내가 '

https://api.site.com/orders    // A list of orders 
https://api.site.com/orders/{orderId}  // An order 
https://api.site.com/orders/{orderId}/ValidationErrors // Get a list of validation results 
https://api.site.com/orders/{orderId}/Submit    // Submit the order for processing 
https://api.site.com/orders/{orderId}/SendForApproval // Send to supervisor 
https://api.site.com/orders/{orderId}/Accept    // Supervisor Accepts the order for processing 
https://api.site.com/orders/{orderId}/Reject    // Supervisor can Reject the order 

답변

3

가능한 한 많이 동사를 URI에 삽입하면 안됩니다. 또한 QueryString 필터는 작업을 지정하는 대신 검색 목적으로 사용해야하므로 user1438038에 동의하지 않습니다.

이 문제를 해결하기위한 더 좋은 방법이 있다고 생각합니다. 먼저, OO 접근법을 사용한다고 가정 할 때 비즈니스 오브젝트와 밀접하게 연관된 방식으로 RESTful API를 모델링해서는 안된다. 또한 REST 관점에서 노출하는 모든 것은 상태 및 동작을 가진 객체가 아니라 리소스라는 것을 기억하십시오.

다른 접근 방식을 제안 하겠지만 시스템 요구 사항을 충족 시킬지 확실하지 않지만 아이디어를 제공하는 것이 유용 할 수 있습니다. 와 감독자 (승인 대기중인 모든 주문을 표시

https://api.site.com/preorders/1 

POST - approves the pre-order. This action's gonna create a new Order. 

: 귀하의 경우에, 당신은

https://api.site.com/preorders 

GET - Display all pre-orders. 
POST - Create a new pre-order. 

는 새로운 질서를 만들기 ... 예약 주문, 주문, 감독과 같은 여러 자원을 가질 수 있습니다 ID = 1).

https://api.site.com/supervisors/1/orders 

승인 및 취소 주문을 검색 :

https://api.site.com/supervisors/1/orders?status=canceled 
https://api.site.com/supervisors/1/orders?status=approved 

주문을 취소 또는 승인하려면 :

https://api.site.com/supervisors/1/orders/1 (DELETE cancels the order) 
https://api.site.com/supervisors/1/orders/1 (POST approves the order) 

이 문제지만를 해결하는 가장 좋은 방법이 있다면 내가 확실 해요을 URI에서 동사를 사용하는 것보다 낫다는 것을 확신합니다.

1

추적 분사, 큐를 인쇄 할 물건을 보내 우리는 매우 비슷한 주문 관리 설정을 사용하고 있습니다.

그러나 또 다른 가능성은 등의 action 매개 변수를 전달 될 것이다 :

https://api.site.com/orders/{orderId}/?action=accept 
https://api.site.com/orders/{orderId}/?action=reject 
... 

REST의 일반적인 생각은 (예 : 위해 또는 고객) 자원을 가지고하는 것입니다. 원하는 것은 RPC 의미론이 더 많지만 옳거나 그름이 없습니다. 귀하의 접근 방식은 합리적입니다.

0

REST uris에서 동사를 사용하는 것이 좋습니다.

따라서 어떤 순서로 상태를 변경하려면 https://api.site.com/orders/ {주문 정보}로 PUT/POST를 보내면 Bussines 로직에 필요한 값만 업데이트 할 수 있습니다.

관련 문제