2016-04-19 2 views
0

Person、Movieの2つのリソースがあるとします。集計データに基づいて問合せを行うためのRESTfulエンドポイントの設計

persons/123 
{id: 123, firstName: "John", lastName:"Travolta"} 

persons/124 
{id: 124, firstName: "Uma", lastName: "Thurman"} 

persons/125 
{id: 125, firstName: "Bob", lastName: "Saget"} 

persons/126 
{id: 126, firstName: "Christopher", lastName: "Walken"} 

persons/127 
{id: 127, firstName: "Steve", lastName: "Buscemi"} 


movies/1 
{id: 1, name: "Pulp Fiction"} 

movies/2 
{id:2, name: "Reservoir Dogs"} 

はその後、両者を関連付けるために、我々は別のリソースを持っている:私は、クリストファー・ウォーケンがでてきた映画のすべてを見たい場合は、私はこれを行うことができます知っているメンバー

GET cast-members?movie.name=Pulp%20Fiction 
[ 
    { 
     id: 502, 
     movie: {id: 1, name: "Pulp Fiction"} 
     actor: {id: 123, firstName: "John", lastName:"Travolta"}, 
     character: "Vincent Vega" 
    }, 
    { 
     id: 503, 
     movie: {id: 1, name: "Pulp Fiction"} 
     actor: {id: 124, firstName: "Uma", lastName: "Thurman"}, 
     character: "Mia Wallace" 
    }, 
    { 
     id: 504, 
     movie: {id: 1, name: "Pulp Fiction"} 
     actor: {id: 126, firstName: "Christopher", lastName: "Walken"}, 
     character: "Buddy Holly" 
    }, 
    ... 
] 

キャスト:

GET cast-members?actor.id=125 

私はすべての映画を見たい場合はユマ・サーマンとジョン・トラボルタの両方がキャストに何をしているところ?このエンドポイントはどのように見えますか?

GET cast-members?actor.id=124&actor.id=125 

は機能しません。

キャストメンバーを返します。ここで、actor.idは124または125のいずれかでしたか?

[ 
    { 
     id: 587, 
     movie: {id: 10, name: "Kill Bill"}, 
     // John's not in this movie 
     actor: {id: 124, firstName: "Uma", lastName: "Thurman"},   
     character: "The Bride" 
    }, 
    { 
     id: 597, 
     movie: {id: 11, name: "Saturday Night Fever"}, 
     // Uma's not in this movie 
     actor: {id: 123, firstName: "John", lastName:"Travolta"}, 
     character: "Tony Manero" 
    }, 
    ... 
] 

それは我々ができるようになる前に、大量のデータをページングしなければならないことを意味するので、我々は望ましくないとする(クライアント側で映画に参加しなければならないので、これは、我々が望むものではありません結果を返す)。

SQLクエリは、このようになります:

SELECT Movie 
FROM CastMember 
WHERE Actor in (124, 125) 
GROUP BY Movie 
HAVING COUNT(DISTINCT Actor) = 2 

はRESTfulな理にかなって何かにこのクエリを変換する方法がありますか?

+0

はい、HTMLフォームに同じ名前の複数のフィールドがある場合と同様に、IDの配列を渡すことができます。しかし、私はこれ以上あなたを助けることはできません、私は他の人が完全な答えで来ると思います。 – watery

+0

なぜ同じクエリパラメータ 'actor.id'を使用しないのですか?どのようなバックエンドを使用していますか? –

+0

@DisplayName 2つのアクタを渡すと、&&または||のいずれかが表示されます。だからactor.id = 123 && actor.id = 124は何も返しません、actor.id = 123 || actor.id = 124は映画ではグループ化しません。 –

答えて

1

おそらく問題は 'キャストメンバー'のリソースです。それは、ある種の「合成」リソースではなく、実際のリソースをモデリングすることは明らかではありません。リレーショナルデータベースのすべてのテーブルが実際にリソースであるとは限りません。 ReSTful関係は、一般に、リソース自体ではなく、リソース間のリンクとしてモデル化されます。

ここにあなたのリソース内訳のコアは、あなたが持っているということです

  • 映画

と、彼らは(おそらく)のコレクションにグループ化している

  • 映画

映画/あなたが

  • を持っているように、あなたのURIのスペースを構築することを言う
    • 映画のコレクションをしてみましょう
  • /映画/ {ID}
    • 特定のIDを持つ個々の映画
  • /人
    • 人々の集まり、映画
    • で、おそらくすべてではないだけの俳優
  • /人/ {ID}指定されたidと
    • 個々の俳優

ある人物が入っていた映画は、「俳優」の質問に基づいてムービーリソースを検索します。このクエリは、複数の値を取ることができます。なぜなら、特定の映画に複数のアクタが存在すると言っても過言ではないからです。あなたは、IDS 1234および5678を持つ人があなたのクエリにあったすべての映画を検索したい場合は

だから、今

GET /movie?actor=1234,5678 

する必要があり、あなたはあなたのユースケースに応じて、いくつかの異なる方法でそれを実装することができ。多分、映画のURIのリストを返すだけで、それぞれを個別に照会しなければならないかもしれませんが、それは素晴らしいとは言えません。おそらく、一方では、(タイトル、フルキャスト、年、長さ、概要、レビューなど)一致するすべてのフルムービードキュメントのリストを返します。これは大量のデータである可能性がありますので、pageパラメータ...

GET /movie?actor=1234,5678&page=2&pageSize=10 

おそらく、あなただけの各映画に関連した内容の一部たい - あなたはあなたのための意味をなすの詳細については、パラメータを追加することができます....

GET /movie?actor=1234,5678&details=title,id,cast 

注:これまでのところ、「人」のリソースは必要ありませんでした。ただし、moviesクエリの応答文書には、個々のムービーURIと人物URIの両方へのリンクが含まれています...

movies?actor=12345,5678 
[ 
{ 
    movie: {id: 10, uri:"/movies/10", name: "...", 
      cast: [{id: 12345, uri:"/people/12345", firstName: ... } 
        {id: 5678, uri:"/people/5678", firstName:...} 
        {...} 
        ] 
    } 
}, 
{ 
    movie: {id: 11, uri: "/movies/11", name: "...", 
      cast: [{id: 12345, uri:"/people/12345", firstName: ... } 
        {id: 5678, uri:"/people/5678", firstName:...} 
        {...} 
        ] 
    } 
}, 
    ... 
] 
関連する問題