2013-06-23 11 views
5

ネットワーク上にビデオサーバーを処理するRESTサービスがあります。REST:複数のIDを使用してコレクションのメンバーにアクセスする

各ビデオサーバーは、シリアル番号、 の名前、またはマシン番号によって識別できます。

私のネットワーク上で使用可能なすべてのサーバーのコレクションを返すために、物事 はかなり単純です:私は、次のルートを定義しています

[Route("/servers", "GET")] 

と、次のリクエストクラス:

public class ServerCollection : IReturn<List<ServerDto>> 
{ 
    ... 
} 

さて、私は自分のコレクションから特定のサーバを返却したいと思います。 はシリアル番号、マシン名、マシン番号のいずれかで識別します。

GET /servers 
:私はを通じて自分のサーバーのコレクションにアクセスすることができ、そう

public class Server : IReturn<ServerDto> 
{ 
    public uint SerialNumber { get; set; } 
    public uint MachineNumber { get; set; } 
    public string MachineName { get; set; } 
} 

[Route("/servers/{SerialNumber}", "GET")] 
[Route("/servers/machinenumbers/{MachineNumber}", "GET")] 
[Route("/servers/machinenames/{MachineName}", "GET")] 

と、次のリクエストクラス:そうするため

は、私は次のルートを定義しました

と特定のサーバーを取得する:

GET /servers/3 
GET /servers/machinenumbers/42 
GET /servers/machinenames/supercalifragilisticexpialidocious 

これは正しい方法ですか?私はこれがあまり RESTfulではないと感じています。 「人工的な」 リソースを使用する代わりに、これをコレクションの検索と見なすべきですか?

答えて

2

私はいつも一意の(シリアル番号が正しいかもしれない)一方的な方法でサービスを表します。

クエリの場合は、/servers/?name=[name]または/server/?id=[id]または/servers/[serial](シリアル番号を直接使用する場合など)を実行します。名前またはIDを要求するときは、要求のURLをservers/[serial]に変更してURLを一意に保つ必要があります。

1

同じ表現(2xx)を3つすべて返すのではなく、2つのURIを別のものに(3xx)リダイレクトする限り、問題ありません。それ以外の場合は、キャッシュ内のコピーを同期させておく時間があるでしょう。あなたの場合は、machinenumbersとmachinenamesリソースをservers/{id}リソースにリダイレクトさせるのが理にかなっています。

何かあれば、それはRESTとは逆のk = vパラメータを使った一般的な検索です。 URIの識別リソースとクエリーストリングはURIの一部であることを忘れないでください。異なるクエリーストリングは異なるリソースを識別します。フォームスタイルのクエリーストリングの用語セットは一般的に(便宜のために)大きく、用語は任意の順序で出現する可能性があるため、潜在的なリソースが爆発的に発生します(キャッシングに頼ることを計画していない場合は効率は、他にもたくさんのオプションがありますが、それはRESTではありません)。

2

私はこれがServiceStackの方法だと思います。両方ともuintフィールドをヌル可能にするだけで、サービス実装ではどんなパラメータで検索するのか確信しています。

関連する問題