비 CRUD 작업을 RESTful 서비스에 추가하는 “RESTful”방법은 무엇입니까? 다음과 같은 레코드에 대한 CRUD 액세스를 허용하는 서비스가 있다고 가정합니다.
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
자동차의 색상을 변경하려면 간단히 POST /api/car/123
새 색상에 대한 POST 변수를 포함합니다.
그러나 내가 자동차를 구매하고 싶다고 가정 해 봅시다. 그 작업은 단순히 “사용자”레코드의 “소유 한 자동차”속성을 업데이트하는 것보다 더 복잡합니다. POST /api/car/123/purchase
“purchase”가 본질적으로 메소드 이름 인, 과 같이 단순히하는 것이 RESTful 입니까? 아니면 PURCHASE
대신에 사용자 지정 HTTP 동사를 사용해야 POST
합니까?
아니면 CRUD가 아닌 작업이 완전히 REST 범위를 벗어 납니까?
답변
구매 를 RESTful 사전 의 비즈니스 엔티티 또는 리소스 로 생각하십시오 . 즉, 구매는 실제로 새로운 리소스를 생성하는 것입니다. 그래서:
POST /api/purchase
새로운 주문을합니다. 세부 정보 (사용자, 자동차 등)는이 주소로 전송 된 콘텐츠 내에서 ID (또는 URI)로 참조되어야합니다.
자동차를 주문하는 것이 데이터베이스의 단순한 INSERT가 아니라는 것은 중요하지 않습니다. 실제로 REST는 데이터베이스 테이블을 CRUD 작업으로 노출하는 것이 아닙니다. 논리적 관점에서 주문 (구매)을 생성하지만 서버 측은 원하는만큼 많은 처리 단계를 자유롭게 수행 할 수 있습니다.
HTTP 프로토콜을 더욱 남용 할 수도 있습니다. Location
헤더를 사용 하여 새로 생성 된 주문에 대한 링크를 반환하고 HTTP 응답 코드를 신중하게 선택하여 문제 (서버 또는 클라이언트 측) 등에 대해 사용자에게 알립니다.
답변
내가 이해하는 RESTful 방법은 새로운 HTTP 동사가 필요하지 않으며 수행해야 할 작업을 의미하는 명사가 어딘가에 있다는 것입니다.
차를 구입 하시겠습니까? 글쎄요
POST /api/order
답변
당신이 정말로하고있는 것은 주문을 만드는 것입니다. 따라서 주문 및 게시를위한 다른 리소스를 추가하고 주문 프로세스 중에 배치합니다.
메서드 호출보다는 리소스 측면에서 생각하십시오.
주문을 완료하려면 POST / api / order // complete 또는 이와 유사한 것입니다.
답변
REST API가 의미론을 제공하는 것보다 훨씬 많은 방법으로 도움이된다고 생각합니다. 따라서 RPC 작업 스타일에서 더 의미가있는 일부 호출 때문에 RPC 스타일을 선택할 수 없습니다. 예는 두 장소 사이의 길 찾기를위한 Google지도 API입니다. 다음과 같이 표시됩니다.
http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
그들은 그것을 “findDirections”(동사)라고 부르고 그것을 연산으로 취급 할 수있었습니다. 오히려 그들은 “방향”(명사)을 리소스로 만들고 길 찾기 리소스에 대한 쿼리로 길 찾기를 처리했습니다 (내부적으로 방향이라는 실제 리소스가 없을 수 있으며 매개 변수를 기반으로 길 찾기를 찾기 위해 비즈니스 로직에 의해 구현 될 수 있음).