REST에서 엔티티 관계 작성 : 하위 ID를 게시하여 상위를 작성할 수 있습니까?


9

현재 기존 고객 데이터에 액세스 할 수있는 REST API를 설계하고 있습니다. API의 요소 중 하나는 사용자의 자산입니다. 주어진 서비스에 따라 자산이 추가됩니다. 백엔드 API는 지정된 서비스에서 사용자에게 자산 만 추가합니다. 따라서 User-Asset 관계는 없지만 User-[Service]-Asset 관계는 없습니다.

URI는 다음과 같습니다.

/users/{id}/assets/{id}/services/{id}

API를 사용하면 자산 ID 및 서비스 ID를 알고 새 항목을 작성합니다. 우리가 어려움을 겪고있는 것은이 관계의 창조입니다.

한 가지 간단한 방법은 전체 관계를 게시하는 것입니다. /users/{id}/assets/

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

그러나 URI가 나타내는 것처럼 실제로 자산을 생성하는 것이 아니라 자산-서비스 관계입니다.

대안으로, 우리는 다음과 같이 관계를 다루는 URI에 POST를 고려하고 있습니다.

POST /users/{id}/assets/{id}/service/{id}
{attribute1:"{var}", attribute2:"{var}"}

그러나이 경우 리소스 경로 /users/{id}/assets/{id}는 POST 전에 존재하지 않으며 부작용으로 생성됩니다.

아직 존재하지 않는 리소스 경로로 POST가 허용됩니까?

당신의 생각에 감사합니다

제라드

답변:


3

사용자가 존재하지 않는 관계에 처음 게시 할 때마다 게시물의 일부로이를 작성한다고 제안하는 것 같습니다.

이러한 종류의 액세스시 작성 패턴이 유효하고 수용 가능한 개발 패턴인지 묻는다면, 그렇습니다. 모두 유효하고 상당히 일반적인 패턴입니다.


1
답변 해주셔서 감사합니다. 내가 참조 할 수있는 참조에 대한 조언이 있습니까?
maasg

2

여기에는 여러 가지 점이 있습니다. 첫째 :이 ID가 이미 존재하거나 특정 기술을 사용하여 ID를 생성하는 시스템 일 수 있으므로 새 자원을 작성할 때 ID를 입력해서는 안됩니다. 생성 된 ID로 피드를 가져 오려면 생성 리소스의 경우 시스템에서 위치 헤더 속성을 설정해야합니다.

둘째 : JSON이 정확하지 않습니다. 자원 URI 서비스에서와 같이 자산 오브젝트 내부의 다른 오브젝트로 서비스를 처리해야하며 배열로 처리해야합니다.

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

이어야한다:

POST /users/{id}/assets    
{services:[{ attribute1:"var", attribute2:"var"}]}

이 방법을 사용하려는 경우

셋째 : 디자인 제안에이 방법을 사용하는 것을 선호하지 않습니다.이 사례가 실패한 경우 자산이나 서비스를 만드는 동안 실패한 것을 어떻게 알 수 있습니까?


0

여기 다른 생각이 있습니다 :

POST /relationships
{ relationship:${id}, asset:{id}, service:{id}, user:{id}, data:"some data" }

이렇게하면 자산, 서비스 및 사용자 간의 3 가지 링크로 관계를 정의하고 계층 적 관계를 암시하지 않습니다.

그런 다음 다음을 수행하여 특정 관계를 검색 할 수 있습니다.

GET /relationships?id="2144321"

또는 다음을 통해 관계의 하위 집합을 검색하십시오.

GET /relationships?user="43434"

또는

GET /relationships?asset="12433"

원래 방법은 틀리지 않지만이 방법을 사용하면 사용 방법에 대한 유연성이 향상 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.